如何在MariaDB或MySQL中创建文本类型的外键?

问题描述:

我有两个表:如何在MariaDB或MySQL中创建文本类型的外键?

CREATE TABLE first_table(
my_id TEXT(6) NOT NULL, 
content VARCHAR(30) NOT NULL, 
PRIMARY KEY(my_id(6)) 
) Engine=InnoDB charset utf8mb4 collate utf8mb4_general_ci; 

CREATE TABLE second_table(
another_id TEXT(6) NOT NULL, 
my_id TEXT(6) NOT NULL, 
another_content VARCHAR(30) NOT NULL, 
PRIMARY KEY(another_id(6)) 
) Engine=InnoDB charset utf8mb4 collate utf8mb4_general_ci; 

但在第二个表,我不能创建引用第一个表的外键,我第一次尝试这样做:

ALTER TABLE second_table 
ADD FOREIGN KEY (my_id) 
REFERENCES first_table(my_id) 
ON DELETE CASCADE ON UPDATE CASCADE; 

,并得到这个错误:

ERROR 1170 (42000): BLOB/TEXT column 'my_id' used in key specification without a key length 
MariaDB [base_ventas]> 

所以,我试图指定密钥长度是这样的:

ALTER TABLE second_table 
ADD FOREIGN KEY (my_id(6)) 
REFERENCES first_table(my_id) 
ON DELETE CASCADE ON UPDATE CASCADE; 

而且我得到了这个错误:

ERROR 1005 (HY000): Can't create table `base_ventas`.`#sql-1a08_23c` 
(errno: 150 "Foreign key constraint is incorrectly formed") 

这不会与数字ID发生,但我需要有字符串类型ID,是可以做到的,或者我失去了一些东西?

+1

这里'TEXT(6)'的含义是什么?使用这些id值,外键,是一个非常糟糕的计划。 – tadman

+0

@tadman我在大学和我的数据库教授做了结构,现在我试图实现它,我的选择可能是一个数字ID中等或int也许 – Alcides

+1

这种模式是很简单*错误*在这么多水平。使用'TEXT'作为标识符是任何理智的代码审查自动失败。如果它们是数字,则使用'INT',否则使用'VARCHAR(6)'。 – tadman

我很抱歉地通知这是不可能的。

根据MySql Documentation

Index prefixes on foreign key columns are not supported. One consequence of this is that BLOB and TEXT columns cannot be included in a foreign key because indexes on those columns must always include a prefix length.

而且MariaDB Documentation

The columns in the child table must be an index, or the leftmost part of an index. Index prefixes are not supported (thus, TEXT and BLOB columns cannot be used as foreign keys)

如果你真的需要字母数字键,可考虑使用像char或varchar代替。最简单,最通用和最常见的方法是使用数字键,如INT。

+1

我有一个疑问:我的大学教授说总是使用非数字ID,如产品的“pro-001”或用户的“usr-001”,但是,从我知道使用int更快更容易,因为自动增量,我认为我的教授试图使数据更清晰,但考虑到性能损失,我是否应遵循她在非分布式系统生产中的规则? – Alcides

+1

“pro-001”很好。但是,如果是真正的固定长度,或者'VARCHAR(22)'(或者某个'理智的'最大长度),它应该被声明为'CHAR(7)'。 'TEXT'不起作用。 'INDEX(foo(6))'不起作用。 –

+0

@RickJames,它是完全正确的?或者在生产中有些不好?我读过字母数字图形用户界面(GUI),它用于使用分布式数据库的系统的技术,但我想知道是否应该避免这种情况发生在未分发的数据库上,例如在小公司中,或者根本不重要? – Alcides