mysql - 无法在 MySQL 中使用 ALTER TABLE 添加外键

标签 mysql foreign-keys

我想在表 data_access_tokens 中的 USERNAME 列中添加一个外键,并使其引用父表 users电子邮件

我检查过 (1) USERNAME(在子表中)和EMAIL(在父表中)都是VARCHAR(128) NOT NULL; (2) 父表中的EMAIL为主键 (3) 两个表都使用默认的数据库引擎和代码页。

为什么以下添加外来的SQL命令失败:

mysql> ALTER TABLE `data_access_tokens`
    ->    ADD FOREIGN KEY (`USERNAME`)
    ->    REFERENCES `users` (`EMAIL`)
    ->    ON DELETE CASCADE;
ERROR 1215 (HY000): Cannot add foreign key constraint

这是父表(用户):

mysql> show create table users;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                          |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| users | CREATE TABLE `users` (
  `EMAIL` varchar(128) NOT NULL,
  `NAME` varchar(255) NOT NULL,
  `ENABLED` tinyint(1) NOT NULL,
  PRIMARY KEY (`EMAIL`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> desc users;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| EMAIL   | varchar(128) | NO   | PRI | NULL    |       |
| NAME    | varchar(255) | NO   |     | NULL    |       |
| ENABLED | tinyint(1)   | NO   |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

这是子表(data_access_tokens):

mysql> show create table data_access_tokens;
+--------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table              | Create Table                                                                                                                                                                                                                                 |
+--------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| data_access_tokens | CREATE TABLE `data_access_tokens` (
  `TOKEN` varchar(50) NOT NULL,
  `USERNAME` varchar(128) NOT NULL,
  `EXPIRATION` datetime NOT NULL,
  `CREATION` datetime DEFAULT NULL,
  PRIMARY KEY (`TOKEN`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+--------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> desc data_access_tokens;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| TOKEN      | varchar(50)  | NO   | PRI | NULL    |       |
| USERNAME   | varchar(128) | NO   |     | NULL    |       |
| EXPIRATION | datetime     | NO   |     | NULL    |       |
| CREATION   | datetime     | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

最佳答案

在这种情况下,问题在于两个表的字符集不同。 data_access_tokens 中的列是 latin1,但它在 users 中引用的列是 utf8

你可以解决这个问题:

ALTER TABLE data_access_tokens CONVERT TO CHARACTER SET utf8;

与许多 ALTER TABLE 语句一样,这将锁定表并重写它。如果表很大,可能需要一些时间。

关于mysql - 无法在 MySQL 中使用 ALTER TABLE 添加外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57482056/

相关文章:

mysql - 重复键更新时的 Node Mysql 仅更新唯一行

mysql - 优化自连接表

java - 如何更新外键列?

mysql - 具有外部约束的sql查询

mysql - 外键问题,错误代码 1452

mysql - 如果mysql中有超过10%的结果超过X

php - Doctrine2 - FindOneBy 外键

php - Mysql Date_Format的多种使用

sql-server - 何时/为何在 SQL Server 中使用级联?

sql - 错误 : there is no unique constraint matching given keys for referenced table "bar"