【问题标题】:MySQL MariaDB wont create Table with a foreign keyMySQL MariaDB 不会使用外键创建表
【发布时间】:2017-04-05 12:51:42
【问题描述】:

我的 SQL 表有问题。所以我有我的用户表:

CREATE TABLE IF NOT EXISTS `user` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `NICKNAME` varchar(50) NOT NULL,
  `PASSWORD` varchar(255) NOT NULL,
  `EMAIL` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`NICKNAME`),
  UNIQUE KEY `ID` (`ID`)
) ;

此表已经存在并且创建时没有任何问题。我想创建一个这样的分数表:

CREATE TABLE IF NOT EXISTS `scores` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `NICKNAME` varchar(50) NOT NULL,
  `HIGHSCORE` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  FOREIGN KEY (NICKNAME) REFERENCES USER(Nickname)
)

在执行查询时,我收到此错误消息:

**#1005 - Kann Tabelle `xxxxx`.`scores` nicht erzeugen (Fehler: 150 "Foreign key constraint is incorrectly formed") (Details…)**

它在德语中说不能创建表,错误 150,我看不出键约束在哪里出错,我在 postgreSQL 中使用了相同的语法,它工作正常,但不知何故 MySQL 不接受它。有什么想法吗?

【问题讨论】:

    标签: mysql sql foreign-keys constraints mariadb


    【解决方案1】:

    这很奇怪。如果nickname 确实是主键,那么您的代码应该可以工作。

    不过,使用自增列作为主键更为自然。如果您想要昵称,请在查询时使用连接。

    所以:

    CREATE TABLE IF NOT EXISTS `scores` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      UserId int(11) NOT NULL,
      `NICKNAME` varchar(50) NOT NULL,
      `HIGHSCORE` int(11) NOT NULL,
      PRIMARY KEY (`ID`),
      FOREIGN KEY (UserId) REFERENCES USER(Id)
    );
    

    【讨论】:

    • 因此,如果我使用以下查询再次创建用户,它应该可以工作吗?:如果不存在则创建表 user (ID int(11) NOT NULL AUTO_INCREMENT, NICKNAME varchar(50)非空,PASSWORD varchar(255) 非空,EMAILvarchar(50) 默认空,主键 (NICKNAME),唯一键 ID (ID),唯一键 NICKNAME (@98765433 @))
    • @AraLight 。 . .您的原始代码应该可以使用,nickname 作为主键。但我会更改用户表,因此整数列是主键。
    【解决方案2】:

    user - 是一个关键字。

    使用另一个表名可能是个好主意,例如"tbl用户", 或再次使用引号 ``

    FOREIGN KEY (NICKNAME) REFERENCES `USER`(ID) 
    

    【讨论】:

      【解决方案3】:

      感谢 Gordon Linoff 先生,我能够找到我的错误:

      我必须将 NICKNAME 声明为 UNIQUE,然后才能将 FOREIGN KEY 约束添加到其他表中

      CREATE TABLE IF NOT EXISTS `user` (
        `ID` int(11) NOT NULL AUTO_INCREMENT,
        `NICKNAME` varchar(50) NOT NULL,
        `PASSWORD` varchar(255) NOT NULL,
        `EMAIL` varchar(100) DEFAULT NULL,
        PRIMARY KEY (`NICKNAME`),
        UNIQUE KEY `ID` (`ID`),
        UNIQUE KEY `NICKNAME` (`NICKNAME`)
      );
      

      【讨论】:

      • 一个PRIMARY KEY是一个UNIQUE KEY;你添加了一个不必要的索引。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 2017-01-02
      • 2014-01-05
      • 1970-01-01
      相关资源
      最近更新 更多