【问题标题】:Error #sql-890_730 when creating constraint in MySQL在 MySQL 中创建约束时出现错误 #sql-890_730
【发布时间】:2017-07-12 03:06:56
【问题描述】:

这是我的t_complaint

    CREATE TABLE `t_complaint` (
  `idcomplaint` int(11) NOT NULL,
  `tglterima` date DEFAULT NULL,
  `dept` varchar(5) DEFAULT NULL,
  `pengirim` varchar(255) DEFAULT NULL,
  `kontak` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `telp` varchar(255) DEFAULT NULL,
  `jenis` varchar(45) DEFAULT NULL,
  `uraian` text,
  `uniqueid` varchar(9) DEFAULT NULL,
  `responder` varchar(245) DEFAULT NULL,
  `tgljawab` date DEFAULT NULL,
  `jawaban` text,
  `status` varchar(45) DEFAULT NULL,
  `tglclose` date DEFAULT NULL,
  `createddate` datetime DEFAULT NULL,
  `createdby` varchar(45) DEFAULT NULL,
  `modifieddate` datetime DEFAULT NULL,
  `modifiedby` varchar(45) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是t_complaint_detail:

    CREATE TABLE `t_complaint_detail` (
  `no` int(11) NOT NULL,
  `uniqueid` varchar(9) DEFAULT NULL,
  `uploader` varchar(100) DEFAULT NULL,
  `st_uploader` int(11) DEFAULT NULL,
  `file_upload` text,
  `original_name` text,
  `status` int(11) DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • t_complaint.idcomplaint 是具有自动增量属性的主键
  • t_complaint_detail.no 是具有自动增量属性的主键
  • 我想通过uniqueid连接这些表
  • 我试过ALTER TABLE t_complaint_detail ADD CONSTRAINT fk_unique FOREIGN KEY ('uniqueid') REFERENCES t_complaint('uniqueid')
  • 上面的查询给出了错误。错误是#1005 - Can't create tablebsm.#sql-890_730(errno: 150 "Foreign key constraint is incorrectly formed") (Details…)
  • 错误中的bsm是我的数据库(我的数据库是bsm)

【问题讨论】:

  • uniqueid varchar(9) DEFAULT NULL,`用int替换varchar并检查
  • 但是,它的值是字符串/文本。
  • uniqueid 是外键吗?对吗?
  • 是的。但我希望这些表通过 uniqueid 连接
  • 所以,这就像在两个表中连接一个外键。可能吗。表投诉中的 uniqueid 是唯一的(从不具有相同的值)。但我将 idcomplaint 分配为主键,因为它具有自动递增属性

标签: php mysql join foreign-keys primary-key


【解决方案1】:

外键必须是父表的主键。问题是,为什么要在两个表中添加冗余的“uniqueId”?您可以像这样简单地定义外键约束:

t_complaint_detail 添加约束 fk_unique FOREIGN KEY ('idcomplaint') REFERENCES t_complaint('idcomplaint')。

它应该可以工作。

【讨论】:

  • idcomplaint 和 no 没有联系。它们都充当主键。但可能有不同的价值
  • 它不必在主键上,您必须删除列名周围的引号或用反引号替换它们。
【解决方案2】:

错误是这样来的

ERROR 1215 (HY000): 无法添加外键约束

因为需要在表中创建primary key,所以可以添加主键 像这样

alter table t_complaint_detail modify uniqueid varchar(20) not null;

alter table t_complaint_detail modify uniqueid varchar(20) not null;

在它工作之后

ALTER TABLE t_complaint_detail ADD CONSTRAINT fk_unique FOREIGN KEY (uniqueid) REFERENCES t_complaint(uniqueid);

please read here for more reference 会有帮助的

【讨论】:

    【解决方案3】:

    它对我来说很好用: 试试这个:

    ALTER TABLE t_complaint ADD CONSTRAINT t_complaint_detail 
    FOREIGN KEY ( uniqueid ) REFERENCES t_complaint( uniqueid )
    

    参考这里: https://www.w3schools.com/sql/sql_foreignkey.asp

    【讨论】:

    • 之所以有效,是因为您删除了 uniqueid 周围的单引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多