不要問爲什麼(因爲答案是'我們完全奇怪和bepsoke設置...'),但我需要在不知道密鑰名稱的情況下刪除表中的唯一密鑰(如果存在) - 僅列出組成密鑰的列。Mysql:刪除一個唯一的密鑰,如果存在 - 但不知道密鑰的名稱或它是否存在
例如我有這個表
CREATE TABLE `my_table` (
`id` binary(36) NOT NULL,
`username` char(12) NOT NULL DEFAULT '',
`password` char(32) NOT NULL DEFAULT '',
`role` char(1) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username_2` (`username`,`role`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `username_3` (`username`),
UNIQUE KEY `username_4` (`username`),
)
,我想放棄了(username,role)
關鍵,但不是別人(雖然只有當它的存在! - 的時候,我得到了它,它可能已經被刪除)
現在我知道如何刪除一個關鍵的時候,我知道了約束名
ALTER TABLE `my_table` DROP KEY `name_of_my_key`
,我知道如何檢查一個唯一的密鑰存在
SELECT EXISTS (SELECT constraint_name
FROM INFORMATION_SCHEMA.table_constraints
WHERE table_name = 'my_table' AND constraint_type='UNIQUE');
但是,當我只知道構成唯一密鑰的列時,這仍然無法幫助我。
感謝您的幫助......當我知道一個鍵存在,我怎麼能僅知道哪些列推導constraint_name命令(S)組成的約束,讓我放棄呢?注意約束名稱,因爲mySQL允許您重複添加相同的密鑰,如上面3個相同的(username)
密鑰。
我發現的唯一的東西是文章,如Drop Foreign Key without knowing the name of the constraint? 它似乎只顯示如何獲取約束名稱,不能以編程方式標識要刪除的約束。
最後,如果有人知道爲什麼地獄的MySQL將允許你反覆添加相同的鍵(非主),以表我會洗耳恭聽。 MySQL,你太瘋狂了。
也許,'DISTINCT'關鍵字會有幫助嗎?無論哪種方式,這是一種奇怪的想法後面的數據庫結構的邏輯,我想出了一個直接的答案。 (就像爲什麼要動態地改變表格一樣) – Xorifelse
我確實說過不要問爲什麼;)但是既然你問過......如果你(或者以前的某個人給你留下了一個作業)使用相同的表格設置數據庫,將副本分發到1000個不同的地方,然後爲它們部署各種補丁。所以我們知道有一些有限制,有些則沒有,並且我們無法確定限制的命名。難道你不喜歡成爲一名開發者... –