2014-07-23 162 views
0

我已经运行mysql的这个查询:外键引用的主键可以是mysql中的varchar(255)吗?

ALTER TABLE `connections` 
    ADD CONSTRAINT `connections_serial_fk` 
     FOREIGN KEY (`serial`) 
     REFERENCES `devices`(serial) 
    ON DELETE CASCADE; 

而且我得到错误号150我已经找了文档和事情,我认为可能会导致此错误是,列“系列'是一个varchar(255)。

This reference表示“innodb允许外键引用任何索引列或列组”。

MySql有这个限制吗?

从我的架构:

设备:

| Field   | Type   | Null | Key | Default | Extra   | 
| serial   | varchar(255) | YES |  | NULL |    | 

连接:

| Field   | Type   | Null | Key | Default | Extra   | 
| serial   | varchar(255) | YES |  | NULL |    | 
+0

编辑您的问题并粘贴您的表格定义。是否有任何类型的设备的唯一约束?串行? –

+0

在那里,我的编辑。这两列的列完全相同,其他字段很常见。没有任何其他限制。 –

+2

'devices.serial'似乎不是主要(或唯一)密钥。 –

回答

1

一个DBMS符合标准的SQL将阻止你的外键引用设置为一列(或者列),它没有某种唯一的约束 - 无论是PRIMARY KEY还是UNIQUE。但在某些情况下MySQL does permit this kind of nonsense

此外,出于性能方面的原因,MySQL要求将参考列索引为 。但是,系统不强制执行 要求,即所引用的列为UNIQUE或声明为NOT NULL。对于包含NULL值的非唯一键或键 的外键引用的处理,对于诸如 UPDATE或DELETE CASCADE之类的操作没有很好地定义。建议您使用外部密钥 只引用UNIQUE(包括PRIMARY)和NOT NULL密钥。

外键应该仅引用已经声明为PRIMARY KEYNOT NULL UNIQUE一列(或列)。如果你认为你需要一个外部关键字引用一个非独特的专栏或专栏,那是一个巨大的红旗,挥舞着你的脸,由一个人大喊:“你有设计问题!”

+0

好的!我为该表创建了一个Id并引用它。这样更好。 –

+1

但是现在你引用了一个id号码,它是前主键的替代物。据我们所知,你*不*引用任何与* serial *(无论* serial *手段)相关的东西。这意味着'on update'和''delete''子句可能不会完全符合你的期望。 (至少,他们不会像原来写的那样完成你想要的问题。)添加ID号很少解决结构性问题。这就是为什么我要求你将你的表结构(CREATE TABLE语句)粘贴到你的问题中。 –

+0

其实我重写了所有这些都是主键的id。你的答案重新思考了一些设计决定,我改变了它。现在我有id作为我的主键。谢谢! –