【问题标题】:mysql unable to add foreign key: error 1215 (hy000)mysql无法添加外键:错误1215(hy000)
【发布时间】:2013-12-25 06:20:06
【问题描述】:

我收到错误 1215 (hy000):无法添加外键约束,然后我运行以下 .sql 文件。下面的代码也没有创建文档表,可能是因为它无法创建外键。谁能告诉我如何修复下面的代码,以便它创建包含外键的文档表而不会引发错误:

CREATE DATABASE IF NOT EXISTS petclinic;
GRANT ALL PRIVILEGES ON petclinic.* TO pc@localhost IDENTIFIED BY 'pc';

USE petclinic;

CREATE TABLE IF NOT EXISTS types (
  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(80),
  INDEX(name)
) engine=InnoDB;

CREATE TABLE IF NOT EXISTS documenttypes (
  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(80),
  INDEX(name)
) engine=InnoDB;

CREATE TABLE IF NOT EXISTS owners (
  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  first_name VARCHAR(30),
  last_name VARCHAR(30),
  address VARCHAR(255),
  city VARCHAR(80),
  telephone VARCHAR(20),
  INDEX(last_name)
) engine=InnoDB;

CREATE TABLE IF NOT EXISTS pets (
  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(30),
  birth_date DATE,
  type_id INT(4) UNSIGNED NOT NULL,
  owner_id INT(4) UNSIGNED NOT NULL,
  INDEX(name),
  FOREIGN KEY (owner_id) REFERENCES owners(id),
  FOREIGN KEY (type_id) REFERENCES types(id)
) engine=InnoDB;

CREATE TABLE IF NOT EXISTS documents (
  id int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  client_id int(4) NOT NULL,
  type_id INT(4), 
  name varchar(200) NOT NULL,
  description text NOT NULL,
  filename varchar(200) NOT NULL,
  content mediumblob NOT NULL, 
  content_type varchar(255) NOT NULL,
  created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (client_id) REFERENCES owners(id),
  FOREIGN KEY (type_id) REFERENCES documenttypes(id)
) engine=InnoDB;

我尝试了at this link 的建议,但这些建议都不适用于此代码。有人可以向我展示一些可以使用此代码的东西吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    外键列的数据类型必须与原始列完全相同。

    试试这个:

    CREATE TABLE IF NOT EXISTS documents (
      id int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
      client_id int(4) UNSIGNED NOT NULL,
      type_id INT(4) UNSIGNED NOT NULL, 
      name varchar(200) NOT NULL,
      description text NOT NULL,
      filename varchar(200) NOT NULL,
      content mediumblob NOT NULL, 
      content_type varchar(255) NOT NULL,
      created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      FOREIGN KEY (client_id) REFERENCES owners(id),
      FOREIGN KEY (type_id) REFERENCES documenttypes(id)
    ) engine=InnoDB;
    

    添加了UNSIGNEDclient_idUNSIGNED NOT NULLtype_id(虽然NOT NULL 部分不是强制性的)

    sqlfiddle demo

    【讨论】:

    • 虽然,NOT NULL 不需要匹配 type_id 的类型。只需INT(4) UNSIGNED
    • 确实如此。我会在我的回答中添加一个注释。
    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 2017-09-01
    • 2021-09-24
    • 2013-09-26
    • 2014-03-27
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多