Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
外键引用的主键是否可以是mysql中的varchar(255)?_Mysql_Foreign Keys_Primary Key - Fatal编程技术网

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

外键引用的主键是否可以是mysql中的varchar(255)?,mysql,foreign-keys,primary-key,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) 表示“innodb允许

我在mysql上运行了以下查询:

ALTER TABLE `connections` 
    ADD CONSTRAINT `connections_serial_fk`
        FOREIGN KEY (`serial`)
        REFERENCES `devices`(serial) 
    ON DELETE CASCADE;
我得到了错误号150。我已经查找了文档,我认为可能导致此错误的原因是列“serial”是一个varchar(255)

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

MySql有这个限制吗

从我的模式:

设备:

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

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

符合标准SQL的dbms将阻止您对没有某种唯一约束(主键或唯一约束)的列设置外键引用。但在某些情况下

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


外键应仅引用已声明为
主键
非空唯一
的列。如果你认为你需要一个或多个非唯一列的外键引用,那就是一个大红旗,在你脸上挥舞,由一个家伙高喊“你有设计问题!”

编辑你的问题并粘贴你的表定义。对任何类型的设备都有唯一的限制吗。串行?这里是我的编辑。两个表上的列完全相同,其他字段非常常见。没有任何类型的其他约束。
设备。串行
似乎不是主键(或唯一键)。每个表中只有一列?确定!我为该表创建了一个Id并引用了它。但现在你引用的是一个id号,它是前一个主键的代理。就我们所知,您没有引用任何与串行相关的内容(无论串行的含义是什么)。这意味着更新时的
和删除时的
子句可能不会达到您预期的效果。(至少,他们不会像你最初写的那样去做你在问题中想做的事情。)添加一个ID号很少能解决结构性问题。这就是为什么我要求你将你的表结构(创建表语句)粘贴到你的问题中。实际上我重写了所有这些,id是主键。你的回答让我重新思考了一些设计决策,我改变了它。现在我把id作为主键。谢谢“现在我把id作为主键。”这可能是个问题,而不是解决方案。您可以使用外键引用它,因为它由索引支持。但是引用代理键与引用同一行中的另一列不同。我不知道怎样才能更清楚地了解这一点。您正在做的事情现在看起来很有效,但它所做的与您开始做的不同。@MauricioMoraes您是否了解,如果connections serial的值必须始终是devices serial的值,那么仍然需要强制执行该约束?另外,如果表T serial需要是设备串行,而现在T有(id,serial),那么您可能现在需要T(id,serial)成为设备(id,serial)。(虽然如果目标字段可以为空,则它们不是FK约束。)但如果您从t中删除了序列,则确定。