2017-09-13 31 views
0

我有兩個表:如何在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

回答

1

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

根據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