2017-03-16 33 views
0

我不是那麼喜歡數據庫,我有以下問題相關的字段可以有一組值。我正在使用MySql如何指定表中的某個字段只能從一組特定值中獲取值?

我有這個DDL表定義:

CREATE TABLE actors (
    id  BigInt(20) UNSIGNED NOT NULL AUTO_INCREMENT, 
    sample_id VarChar(128) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, 
    `role` Char(2) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, 
    wiews  VarChar(16) CHARACTER SET latin1 COLLATE latin1_swedish_ci, 
    pid  VarChar(16) CHARACTER SET latin1 COLLATE latin1_swedish_ci, 
    `name` VarChar(128) CHARACTER SET latin1 COLLATE latin1_swedish_ci, 
    address VarChar(128) CHARACTER SET latin1 COLLATE latin1_swedish_ci, 
    country Char(3) CHARACTER SET latin1 COLLATE latin1_swedish_ci, 
    PRIMARY KEY (
     id 
) 
) ENGINE=InnoDB AUTO_INCREMENT=1 ROW_FORMAT=COMPACT DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; 
ALTER TABLE actors COMMENT = ''; 
ALTER TABLE actors ADD CONSTRAINT fk_actors_pgrfas FOREIGN KEY (sample_id) 
    REFERENCES pgrfas (sample_id) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION; 

,因爲是由應用程序使用我不能改變這些字段的類型。

有人爲我提供一個規範,指出作用場(即必須是一個CHAR(2))可以採取只在此設定值:IN(「公關」,「合作」 ,'br')

如何在前面的DDL聲明中指定該字段只能包含這3個值中的一個?

回答

1

可以使用一個ENUM

的ENUM是與來自被在創建表時明確地列舉在列 說明書 允許值的列表中選擇的一個值的字符串對象

https://dev.mysql.com/doc/refman/5.7/en/enum.html

如...

CREATE TABLE your_table (
     col1 VARCHAR(40), 
     role ENUM('pr','co','br') 
); 
+0

這絕對是正確的解決方案,但是OP聲明他不能更改表格定義。 –

+0

然後OP可以檢查插入/更新服務器端或存儲過程 – scaisEdge

+0

然而,賦值爲2的char值不會改變在其他應用程序中使用的數據類型。 – scaisEdge

1

MySQL不提供檢查約束。此外,您需要修改表格以使它們成爲枚舉(否則這將是MySQL中針對少數值的最佳方法)。

但是,你可以用外鍵引用來做到這一點。

create table Roles (
    RoleName char(2) primary key 
); 

insert into Roles (RoleName) 
    values ('pr'), ('co'), ('br'); 

alter table actors add constraint fk_actors_roles 
    foreign key (role) references Roles(RoleName); 
相關問題