簡體   English   中英

如何刪除 MySQL 中的唯一約束?

[英]How to remove unique constraint in MySQL?

我在網上搜索關於如何在互聯網上刪除 MySQL 中的唯一約束,我找到了很多解決方案。

  1.  DROP INDEX index_name ON table_name;
  2.  ALTER TABLE table_name DROP INDEX index_name;
  3.  ALTER TABLE table_name DROP CONSTRAINT constraint_name;

所有這些查詢之間有什么區別? 這些查詢中的哪一項符合標准 SQL?

另外,唯一約束、唯一索引和唯一鍵之間有什么區別?

MySQL 詞匯表截圖;鏈接:https://dev.mysql.com/doc/refman/8.0/en/glossary.html

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 CONSTRAINTADD 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_nameDROP INDEX index_name ON tbl_name來移除 UNIQUE 約束。

ALTER TABLE tbl_name DROP INDEX index_nameDROP INDEX index_name ON tbl_name之間的區別已在此答案中進行了說明。

暫無
暫無

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

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