外键引用的主键可以是mysql中的varchar(255)吗?

时间:2014-07-23 14:13:56

标签: mysql foreign-keys primary-key

我在mysql上运行此查询:

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

我收到错误编号150.我已经查找了文档,我认为可能导致此错误的是该列' serial'是一个varchar(255)。

This reference说" innodb允许外键引用任何索引列或列组#34;。

MySql是否有此限制?

从我的架构:

设备:

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

连接:

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

1 个答案:

答案 0 :(得分:1)

符合标准SQL的dbms将阻止您设置对没有某种唯一约束的列(或列)的外键引用 - PRIMARY KEY或UNIQUE。但在某些情况下MySQL does permit this kind of nonsense

  

此外,MySQL要求对引用的列进行索引   出于性能原因。但是,系统不强制执行   要求引用的列为UNIQUE或声明为NOT   空值。处理对非唯一键或键的外键引用   对于诸如的操作,没有很好地定义包含NULL值的值   更新或删除CASCADE。建议您使用外键   仅引用UNIQUE(包括PRIMARY)和NOT NULL键。

外键只应引用已声明为PRIMARY KEYNOT NULL UNIQUE的一列(或多列)。如果你认为你需要一个非独特的一列或多列的外键引用,这是一个大红旗,挥舞着你的脸,由一个男人大喊大叫,"你有一个设计问题!"