2014-02-11 55 views
3

,我用它來CREATETABLE命令創建MySQL的一個表:與主文本鍵

CREATE TABLE carts(order_id TEXT(14), items TEXT, shipping INT, price INT 

我想設置「ORDER_ID」作爲我的主鍵。我試圖ALTERTABLE有:

ALTER TABLE `carts` ADD PRIMARY KEY(order_id) 

但是返回錯誤:

#1170 - BLOB/TEXT column 'order_id' used in key specification without a key length 

我的理解是指長度不正確設置的初始設置,所以我嘗試:

ALTER TABLE `carts` ADD PRIMARY KEY(order_id(14)) 

它返回相同的錯誤。在phpmyadmin中定義的類型是'tinytext';我期待看到TEXT(14)

我在PHP中通過PDO執行所有這些命令。將'order_id'列設置爲我的TABLE的主鍵的正確方法是什麼?

+2

將'text'更改爲'varchar'。您不能將文本設置爲主鍵。 –

+0

您不能使用'TEXT'數據類型作爲主鍵。 – Barmar

+0

你最後的陳述很好,它會創建長度爲14的主鍵。那麼錯誤是什麼? –

回答

0

發生錯誤是因爲MySQL只能索引BLOB或TEXT列的前N個字符。所以錯誤主要發生在您嘗試將主要關鍵字設置爲TEXT或BLOB的字段/列類型(或屬於TEXT或BLOB類型,例如TINYBLOB,MEDIUMBLOB,LONGBLOB,TINYTEXT,MEDIUMTEXT和LONGTEXT)或指數。

對於沒有長度值的完整BLOB或TEXT,MySQL無法保證列的唯一性,因爲它具有可變和動態大小。因此,當使用BLOB或TEXT類型作爲索引時,必須提供N的值,以便MySQL可以確定密鑰長度。但是,MySQL不支持TEXT或BLOB上的密鑰長度限制。 TEXT(11)根本無法工作。

3

在MySQL BLOB/TEXT不作爲表的一部分,而是從其他內存位置引用它們。所以他們不能被視爲KEY的一部分。

您必須將其定義爲VARCHAR(14)。

ALTER TABLE `carts` modify order_id VARCHAR(14); 

然後你就可以申請PK了。

ALTER TABLE `carts` ADD PRIMARY KEY(order_id);