Câu hỏi Làm thế nào để tạo ENUM loại trong SQLite?


Tôi cần phải chuyển đổi một bảng từ MySQL sang SQLite, nhưng tôi không thể tìm ra cách chuyển đổi một trường enum, bởi vì tôi không thể tìm thấy ENUM gõ vào SQLite.

Trường nói trên là pType trong bảng sau:

CREATE TABLE `prices` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `pName` VARCHAR(100) NOT NULL DEFAULT '',
    `pType` ENUM('M','R','H') NOT NULL DEFAULT 'M',
    `pField` VARCHAR(50) NULL DEFAULT NULL,
    `pFieldExt` VARCHAR(50) NULL DEFAULT NULL,
    `cmp_id` INT(11) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
)
ENGINE=MyISAM
ROW_FORMAT=DEFAULT

Tôi cần một trường chỉ có ba giá trị để người dùng chọn và tôi muốn thực thi điều đó trong DB, không chỉ trong ứng dụng của tôi.


76
2018-03-14 13:34


gốc




Các câu trả lời:


Không có loại enum trong SQLite, chỉ có những điều sau đây:

  • VÔ GIÁ TRỊ
  • INTEGER
  • THỰC
  • BẢN VĂN
  • BLOB

Nguồn: http://www.sqlite.org/datatype3.html

Tôi sợ một bảng enum nhỏ, tùy chỉnh sẽ được yêu cầu trong trường hợp của bạn.


54
2018-03-14 15:52



Trên thực tế "một bảng enum tùy chỉnh" là một thiết kế sạch hơn nhiều bằng cách sử dụng enums thực - a_horse_with_no_name
Tại sao không sử dụng CHECK () hạn chế để cho phép chỉ có ba chuỗi có thể? - mateusza
> chỉ cho phép ba chuỗi có thể: Vì lưu trữ cho chuỗi? - Caleb Paul
@Wideshanks Tôi không nghĩ CHECK() tồn tại vào thời điểm tôi viết câu trả lời đó. Trừ khi chuỗi là có thật không ngắn, tôi hoàn toàn chống lại nó. Tối đa 1 hoặc 2 ký tự. - MPelletier
@HammanSamuel Nó không phải mới, nó được giải quyết như ý nghĩa TEXT. Trên trang nguồn tôi đã đưa ra, xem điểm 2.1 về Xác định mối quan hệ cột. - MPelletier


Cách SQLite

CREATE TABLE prices (
 id INTEGER PRIMARY KEY,
 pName TEXT CHECK( LENGTH(pName) <= 100 ) NOT NULL DEFAULT '',
 pType TEXT CHECK( pType IN ('M','R','H') ) NOT NULL DEFAULT 'M',
 pField TEXT CHECK( LENGTH(pField) <= 50 ) NULL DEFAULT NULL,
 pFieldExt TEXT CHECK( LENGTH(pFieldExt) <= 50 ) NULL DEFAULT NULL,
 cmp_id INTEGER NOT NULL DEFAULT '0'
)

59
2018-06-19 23:29





Đối với những người khác đến dự án này trong tương lai, để mở rộng câu trả lời của MPelletier, bạn có thể tạo các bảng dưới dạng:

CREATE TABLE Price (
  PriceId INTEGER       PRIMARY KEY AUTOINCREMENT NOT NULL,
  Name    VARCHAR(100)  NOT NULL,
  Type    CHAR(1)       NOT NULL DEFAULT ('M') REFERENCES PriceType(Type)
);

CREATE TABLE PriceType (
  Type    CHAR(1)       PRIMARY KEY NOT NULL,
  Seq     INTEGER
);
INSERT INTO PriceType(Type, Seq) VALUES ('M',1);
INSERT INTO PriceType(Type, Seq) VALUES ('R',2);
INSERT INTO PriceType(Type, Seq) VALUES ('H',3);

Thực hiện như thế này, các giá trị liệt kê có sẵn trực tiếp trong bảng Giá vì chúng sẽ sử dụng ENUM: bạn không cần phải tham gia vào bảng PriceType để lấy các giá trị Loại, bạn chỉ cần sử dụng nó nếu bạn muốn xác định trình tự của ENUM.

Các ràng buộc khoá ngoại được giới thiệu trong phiên bản SQLite 3.6.19.


49
2018-05-30 07:30



INSERT INTO PriceType(Type, Seq) VALUES ('M',1), ('R',2), ('H',3); Nếu bạn gặp lỗi cú pháp. "Biểu mẫu đầu tiên (với từ khóa" VALUES ") tạo một hàng mới trong một bảng hiện có.": sqlite.org/lang_insert.html. Phá vỡ nó tránh điều đó: INSERT INTO PriceType(Type, Seq) VALUES ('M',1); INSERT INTO PriceType(Type, Seq) VALUES ('R',2); INSERT INTO PriceType(Type, Seq) VALUES ('H',3); - ahcox
Có một câu trả lời là một bình luận, nhưng giờ nó đã biến mất. Về cơ bản, kể từ SQLite 3.7.11, một số mục có thể được thực hiện bằng INSERT. Cú pháp đã sửa cũng vẫn hoạt động. - MPelletier
Đừng quên PRAGMA foreign_keys = ON; cho mỗi phiên - vì các phím tắt bị tắt theo mặc định trong sqlite3 - smathy
Nếu bạn muốn tránh quên PRAGMA foreign_keys = ON; sau đó bạn có thể thiết lập điều đó trong tệp .sqliterc trong thư mục chính của bạn. - Eradicatore
Ngoài ra, bạn có thể muốn sử dụng UNIQUE ràng buộc trên Seq. Một cái gì đó như thế này CREATE TABLE PriceType( Type Char(1) PRIMARY KEY NOT NULL, Seq INTEGER UNIQUE); - Eradicatore