[英]How to remove unique constraint in MySQL?
SQL 的許多用戶沒有意識到索引不在 SQL 標准中。
Go 前面,嘗試在 ANSI/ISO SQL 規范中找到索引的 CREATE INDEX、DROP INDEX 或任何其他相關語法。
約束在規范中。 以下是“SQL-99,完整,真正”一書在線版中 UNIQUE CONSTRAINT 的報道鏈接
UNIQUE 約束描述了對給定表執行的 INSERT/UPDATE/DELETE 操作行為的邏輯限制。 也就是說,在約束中命名的唯一列中,任何兩行都不能具有相同的非 NULL 值。
但索引是一個實現細節,SQL 標准將實現細節留給供應商。
碰巧添加索引數據結構是使約束的實現有希望高效的最常見方法。 因此,幾乎所有 SQL 供應商都具有類似的功能,並且他們使用必要的語句和子句擴展 SQL 語法以支持索引。
坦率地說,供應商之間的索引語法如此相似是一個奇跡。 這給用戶一種印象,即供應商正在遵守 SQL 標准的某些部分。 他們不是; 他們只是在模仿早期的實現。
回復您的評論:
這兩個查詢完成了同樣的事情。 語義上沒有區別,只有語法上的區別。
DROP INDEX index_name ON table_name;
ALTER TABLE table_name
DROP INDEX index_name;
例如,使用 ALTER TABLE,您可以將刪除索引與同一張表上的其他更改操作結合起來,例如刪除多個索引,或創建新索引,或任何其他更改。
但是 DROP INDEX 只允許您在一張表上刪除一個索引。
然后第三個查詢刪除一個約束。 約束不是索引。
ALTER TABLE table_name
DROP CONSTRAINT constraint_name;
這可能會產生刪除索引的效果,但不一定。 這取決於您要刪除的約束類型。 例如,刪除 UNIQUE 約束會隱式刪除與該約束關聯的索引。 而刪除 FOREIGN KEY 或 CHECK 約束不會刪除同一列上的索引。
DROP INDEX index_name ON table_name;
和
ALTER TABLE table_name
DROP INDEX index_name;
完全一樣。 此外,第一個查詢實際上映射到第二個查詢。
ALTER TABLE table_name
DROP CONSTRAINT constraint_name;
執行另一個 function。
索引是表內的結構。 DROP INDEX
刪除索引(對不起..)。
約束是表內的一條規則,這條規則可以伴隨着相應的索引創建以維護約束。 DROP CONSTRAINT
刪除約束。 但是,如果創建了用於維護的索引,則不會刪除該索引。 見小提琴。
從 MySQL 8.0.19 開始,
ALTER TABLE
允許更通用(和 SQL 標准)語法來刪除和更改任何類型的現有約束,其中約束類型由約束名稱確定:
- 刪除一個名為 symbol 的現有約束:
ALTER TABLE tbl_name DROP CONSTRAINT symbol;
SQL 標准規定所有類型的約束(主鍵、唯一索引、外鍵、校驗)屬於同一個命名空間。 在 MySQL 中,每個約束類型的每個模式都有自己的命名空間。 因此,每個模式的每種約束類型的名稱必須是唯一的,但不同類型的約束可以具有相同的名稱。 當多個約束同名時,
DROP CONSTRAINT
和ADD CONSTRAINT
不明確,會出現錯誤。 在這種情況下,必須使用特定於約束的語法來修改約束。 例如,使用DROP PRIMARY KEY
或 DROP FOREIGN KEY 刪除主鍵或外鍵。
資源
因此,從技術上講,在 MySQL 8.0.19 或更高版本上,我們可以使用ALTER TABLE tbl_name DROP CONSTRAINT constraint_name
來刪除 UNIQUE 約束。 但是,如果某些其他約束與 UNIQUE 約束具有相同的名稱,則此方法將不起作用。 在這種情況下,我們必須使用ALTER TABLE tbl_name DROP INDEX index_name
或DROP INDEX index_name ON tbl_name
來移除 UNIQUE 約束。
ALTER TABLE tbl_name DROP INDEX index_name
和DROP INDEX index_name ON tbl_name
之間的區別已在此答案中進行了說明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.