【问题标题】:MySQL Workbench setting column as UNIQUE, but should it?MySQL Workbench 将列设置为 UNIQUE,但应该这样做吗?
【发布时间】:2014-07-25 21:15:22
【问题描述】:

为了我的一生,我不能,为了一个:

弄清楚为什么 MySQL 抱怨这个 INSERT 声明:

CREATE TABLE IF NOT EXISTS `mangobase`.`profile_education` (
  `id` TINYINT UNIQUE UNSIGNED NOT NULL DEFAULT 0,
  `description` VARCHAR(50) NOT NULL DEFAULT 'xxx',
  PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;

投诉:

ERROR 1064 (42000) at line 91: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNSIGNED NOT NULL DEFAULT 0,
  `description` VARCHAR(50) NOT NULL DEFAULT 'xxx',' at line 2

删除id 列定义中的UNIQUE 允许此语句无错误地通过。但是,其次,为什么首先要创建它?我没有将它指定为 MySQL Workbench 中的唯一列(UQ 将列指定为唯一):

我有其他表以完全相同的方式定义(相同的字段名称,定义属性),其中 MySQL WB 没有将 UNIQUE 分配给列定义。每次我想在生产期间更新数据库时都需要手动编辑 sql 脚本确实很乏味。

  1. 是否有明显的我忽略的东西导致 MySQL WB 将 UNIQUE 分配给此列?
  2. 为什么“UNIQUE”一开始在这里似乎是非法的?

【问题讨论】:

    标签: mysql sql database database-design mysql-workbench


    【解决方案1】:

    您不能将unique 放在tinyintunsigned 之间。这些都是类型定义的一部分。试试这个:

    CREATE TABLE IF NOT EXISTS `mangobase`.`profile_education` (
      `id` TINYINT UNSIGNED UNIQUE NOT NULL DEFAULT 0,
      `description` VARCHAR(50) NOT NULL DEFAULT 'xxx',
      PRIMARY KEY (`id`)
    );
    

    编辑:

    您不需要将主键指定为唯一的。我会这样写:

    CREATE TABLE IF NOT EXISTS `mangobase`.`profile_education` (
      `id` TINYINT UNSIGNED UNIQUE NOT NULL PRIMARY KEY,
      `description` VARCHAR(50) NOT NULL DEFAULT 'xxx'
    );
    

    我认为没有理由为主键设置默认值。也许你也希望它是自动递增的。

    【讨论】:

    • 是的,我明白了。这也很有意义(列属性不应与类型定义混合)。我猜工作台不知道这一点,这很奇怪,因为似乎这种行为在不久前就已经被接受并现在得到纠正。您是否知道是否有必要将主键指定为唯一的?
    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    相关资源
    最近更新 更多