簡體   English   中英

ALTER TABLE添加復合主鍵

[英]ALTER TABLE to add a composite primary key

我有一個叫做provider的表。 我有三個名為personplacething欄目。 可能存在重復的人,重復的地方和重復的事物,但是永遠不會存在重復的人物 - 事物 - 組合。

我如何使用這三列在ALTER TABLE中為MySQL中的此表添加復合主鍵?

ALTER TABLE provider ADD PRIMARY KEY(person,place,thing);

如果主鍵已存在,那么您希望這樣做

ALTER TABLE provider DROP PRIMARY KEY, ADD PRIMARY KEY(person, place, thing);

@Adrian Cornish的回答是正確的。 但是,刪除現有主鍵還有另一個警告。 如果該主鍵被另一個表用作外鍵,則在嘗試刪除它時會出錯。 在某些版本的mysql中,錯誤消息格式錯誤(從5.5.17開始,此錯誤消息仍然存在

alter table parent  drop column id;
ERROR 1025 (HY000): Error on rename of
'./test/#sql-a04_b' to './test/parent' (errno: 150).

如果要刪除另一個表引用的主鍵,則必須先將該外鍵放在該另一個表中。 如果在重新創建主鍵后仍需要該外鍵,則可以重新創建該外鍵。

此外,使用復合鍵時,順序很重要。 這些

1) ALTER TABLE provider ADD PRIMARY KEY(person,place,thing);
and
2) ALTER TABLE provider ADD PRIMARY KEY(person,thing,place);

不是一回事。 它們都在這三個字段中強制實現唯一性,但從索引角度來看,存在差異。 字段從左到右編制索引。 例如,請考慮以下查詢:

A) SELECT person, place, thing FROM provider WHERE person = 'foo' AND thing = 'bar';
B) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz';
C) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz' AND thing = 'bar';
D) SELECT person, place, thing FROM provider WHERE place = 'baz' AND thing = 'bar';

B可以使用ALTER語句1中的主鍵索引
A可以使用ALTER語句2中的主鍵索引
C可以使用任一索引
D不能使用任何一個索引

A使用索引2中的前兩個字段作為部分索引。 A不能使用索引1,因為它不知道索引的中間位置部分。 盡管如此,它仍然可以使用部分索引。

D不能使用任何索引,因為它不知道人。

有關更多信息,請參閱此處的mysql文檔。

您可能只想要一個獨特的約束。 特別是如果你已經有一個代理鍵。 (已存在的代理鍵的示例是單個列,即AUTO_INCREMENT)

下面是Unique Constraint的sql代碼

ALTER TABLE `MyDatabase`.`Provider`
    ADD CONSTRAINT CK_Per_Place_Thing_Unique UNIQUE (person,place,thing)
;
alter table table_name add primary key (col_name1, col_name2);

使用COMPOSITE UNIQUE KEY肯定會更好,正如@GranadaCoder提供的那樣,雖然有點棘手:

ALTER IGNORE TABLE table_name ADD UNIQUES INDEX idx_name(some_id, another_id, one_more_id);

ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM