【问题标题】:How can I specify that a field of a table can have a value take only from a specific set of values?如何指定表的字段只能从一组特定值中获取值?
【发布时间】:2017-03-16 20:35:35
【问题描述】:

我对数据库不太感兴趣,并且我遇到了以下问题,这些问题与字段可以具有的一组值有关。我正在使用 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;

我无法更改这些字段的类型,因为它们已被应用程序使用。

有人向我提供了一个规范,说明 role 字段(必须是 Char(2))只能采用此集合中的值:IN('pr','co','br').

如何在前面的 DDL 语句中指定该字段只能具有这 3 个值之一?

【问题讨论】:

    标签: mysql sql database rdbms ddl


    【解决方案1】:

    你可以使用枚举

    ENUM 是一个字符串对象,其值选自 在列中显式枚举的允许值 表创建时的规范

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

    例如...

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

    【讨论】:

    • 这绝对是正确的解决方案,但是 OP 声明他无法更改表定义。
    • 然后OP可以检查插入/更新服务器端或存储过程
    • 但是,分配值为 2 的 char 的 ENUM 不会更改应用程序其他部分中使用的数据类型 ..
    【解决方案2】:

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 2019-04-19
      相关资源
      最近更新 更多