mysql - 外键创建

标签 mysql sql

我在向 MySQL 数据库中的表添加外键约束时遇到一些问题。

我有以下用户表:

CREATE TABLE `user` (
   `Id` varchar(128) NOT NULL,
   `Email` varchar(255) NOT NULL,
   `EmailConfirmed` tinyint(1) NOT NULL,
   `PasswordHash` longtext,
   `SecurityStamp` longtext,
   `PhoneNumber` longtext,
   `PhoneNumberConfirmed` tinyint(1) NOT NULL,
   `TwoFactorEnabled` tinyint(1) NOT NULL,
   `LockoutEndDateUtc` datetime DEFAULT NULL,
   `LockoutEnabled` tinyint(1) NOT NULL,
   `AccessFailedCount` int(11) NOT NULL,
   `UserName` varchar(255) NOT NULL,
   PRIMARY KEY (`Id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1

这是我的用户通知表,我正在尝试添加外键:

CREATE TABLE `usernotice` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `notifySitemap` bit(1) NOT NULL,
   `notifyRobots` bit(1) NOT NULL,
   `user_id` varchar(128) DEFAULT NULL,
   `health_site_id` int(11) DEFAULT NULL,
   PRIMARY KEY (`id`),
   KEY `user_constraint_idx` (`user_id`),
   KEY `healthSiteId_idx` (`health_site_id`),
   CONSTRAINT `healthSiteId` FOREIGN KEY (`health_site_id`) REFERENCES `health_site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

我正在尝试引用 usernotice.user_id 列中的 user.id 列。为此,我使用以下 SQL:

ALTER TABLE usernotice
ADD CONSTRAINT userId
  FOREIGN KEY (user_id)
  REFERENCES user (Id)
  ON DELETE NO ACTION
  ON UPDATE NO ACTION;

当我执行此命令时,我收到错误代码 1215。谁能告诉我我做错了什么?

编辑:检查show create table查询后,我注意到所使用的字符集存在差异。使用另一个字符集重新创建 usernotice 表修复了此问题。

最佳答案

https://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html外键和引用键中的对应列必须具有相似的数据类型。整数类型的大小和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。

你们的字符集不一样...

关于mysql - 外键创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47031627/

相关文章:

mysql - 如何在 Laravel 中使用 OUT 参数调用 MySQL 存储过程

java - 在 Java 中转义撇号

mysql - 加入不要覆盖结果 mysql

mysql - SQL 错误 : Row size too large for VARCHAR(20)

sql - MySQL如何过滤出多个匹配键的记录?

php - SQL 查询优化帮助

mysql - 在 SQL : Error 中使用转换语句

mysql - C语言如何防止SQL注入(inject)?

sql - 为什么稀疏列中的非空值在 SQL Server 2008 中占用额外空间

mysql - 将 SQL 查询转换为 Rails