无法找到解决方案"无法添加外键约束"

时间:2015-10-15 10:52:18

标签: mysql foreign-keys

我试图用外键创建一些表,但是我收到了这个错误。

  • 我在创建引用的
    之前没有创建外键 表。
  • 我还尝试使用ALTER TABLE语句添加
    外键约束。
  • 两个字段都具有相同的数据类型。
  • 它不是int,所以它不是关于unsigned int问题
  • 我读过关于索引外键的索引,但我不明白该怎么做,而且我不能100%确定为什么要这样做。

这些是我的CREATE TABLEs:

    CREATE TABLE snmptt_listpolls ( 
      id int(11) NOT NULL AUTO_INCREMENT, 
      ip varchar(50) NOT NULL DEFAULT 'no_ip_found', 
      polling_time int(10) NOT NULL, 
      communitydata varchar(100) NOT NULL, 
      snmp_oid varchar(250) DEFAULT NULL, 
      lastcheck datetime DEFAULT NULL, 
      PRIMARY KEY (id)
    );

    CREATE TABLE snmptt_nodes (  
      ID int(11) NOT NULL AUTO_INCREMENT,
      name varchar(255) DEFAULT NULL, 
      ip varchar(50) NOT NULL DEFAULT 'no_ip_found',   
      PRIMARY KEY (ID),
      UNIQUE KEY ip(ip),
      FOREIGN KEY (ip) REFERENCES snmptt_listpolls(ip)) ;
  

------------------------最新的外键错误

     

151015 12:42:24表noname_jc_sandbox / snmptt_nodes的外键约束出错:FOREIGN KEY(ip)   参考资料snmptt_listpolls(ip)):找不到索引   引用的列,其中引用的列显示为第一个   表中的列或列类型以及引用的表中没有   匹配约束。请注意ENUM的内部存储类型和   在使用> = InnoDB-4.1.12创建的表中更改了SET,以及此类列   在旧表中,新表中的这些列不能引用它们。看到   http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html   正确的外键定义。

2 个答案:

答案 0 :(得分:2)

错误消息说明了:

  

...在引用的表格中找不到索引...

在创建snmptt_nodes表之前执行此操作:

CREATE INDEX idx_snmptt_listpolls_ip ON snmptt_listpolls(ip);

答案 1 :(得分:0)

尽管与OP无关,我仍然要指出此错误是由另一个不可思议的原因引起的。

原因是CHARSET。如果您使用CHARSET = latin1创建了引用表(创建表时我没有提供字符集,也许是默认的),并尝试使用其他一些CHARSET创建引用表,例如utf8,那么您也会收到此错误。

底线:确保引用表和被引用表的CHARSET相同。