【问题标题】:Why won't my foreign key create in MySQL?为什么我的外键不会在 MySQL 中创建?
【发布时间】:2015-04-09 18:43:37
【问题描述】:

我尝试了许多不同的方法来使用外键创建表并尝试插入到 phpMyAdmin。但是,它并没有像我预期的那样工作。

这是我到目前为止所做的:

CREATE TABLE user (
    user_id BIGINT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    user_name VARCHAR(50) NOT NULL,
    user_password VARCHAR(50) NOT NULL);

这工作得很好。但是,如果我尝试添加一个带有外键的表,它会拒绝创建:

CREATE TABLE article (
    article_id INT(20) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    article_title VARCHAR(100) NOT NULL,
    article_content VARCHAR(1000) NOT NULL,
    user_id INT(10) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES user (user_id));

这不会按预期工作,并且不会将表添加到 MySQL 数据库。我收到此错误:

不能添加外键约束

我该如何解决?

【问题讨论】:

  • 如果你输入第二个查询会发生什么?你有错误吗?如果是这样,你会得到什么错误? (这两个查询似乎都有一个尾随双引号,这会导致语法错误。如果您将其添加到 phpMyAdmin,则将其删除 - 这可能是您的问题)。
  • 为什么使用INT(20) 而不是BIGINT(20)。还有为什么VARCHAR(1000) 而不仅仅是TEXTBLOB 数据类型?
  • 啊!您的 article 表缺少 user_id 的定义 - 您需要在声明 FOREIGN KEY 之前明确定义它。
  • 好吧,也许这就是问题所在。 @halfer 你能举例说明 user_id 的定义吗?
  • 只需要在FK上面添加一个定义,比如user_id BIGINT(20) NOT NULL,,这样它就可以匹配另一个表中主键的定义。

标签: php mysql database phpmyadmin


【解决方案1】:

我们在 cmets 中发现,如果主键是这样定义的:

user_id BIGINT(10) UNSIGNED

然后这样的外键将不起作用,因为它需要匹配签名(我认为也是类型):

user_id INT(10) NOT NULL

这很好用:

user_id BIGINT(10) UNSIGNED NOT NULL

这是一个 Fiddle 来证明它的工作原理。

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 2012-06-19
    • 2022-08-17
    • 2021-02-05
    • 2020-04-16
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多