我在mysql數據庫中有一個表QUES
。如何在MySQL表中創建一個唯一的列?
該表有一列BODY
,目前它不是唯一的。
表中有很多這些我肯定目前BODY
是唯一的性質,但沒有定義爲屬性。
我該如何更新列號爲BODY
的唯一定義爲屬性?
有人可以建議正確的SQL查詢相同嗎?
感謝
我在mysql數據庫中有一個表QUES
。如何在MySQL表中創建一個唯一的列?
該表有一列BODY
,目前它不是唯一的。
表中有很多這些我肯定目前BODY
是唯一的性質,但沒有定義爲屬性。
我該如何更新列號爲BODY
的唯一定義爲屬性?
有人可以建議正確的SQL查詢相同嗎?
感謝
ALTER TABLE QUES ADD UNIQUE (BODY).
閱讀精細的手工here。
以下是一些可幫助您入門的示例SQL語句。假定body
是一個字符類型的列,並且您希望儘可能多地「保留」現有值,並附加一個唯一字符串以使其「更獨特」。
-- find values of `body` that are "duplicated" in the table
SELECT q.body
, COUNT(1) as cnt_
FROM ques q
GROUP BY q.body
HAVING COUNT(1) > 1
該查詢只是讓我們說是「重複」的body
特定的值,並分享該值的行數的計數。我們需要能夠識別具有這些獨特的值的行,所以我們可以像這樣運行查詢:
-- find all rows that have one of the "duplicated" values
SELECT s.id
, s.body
FROM (SELECT q.body
FROM ques q
WHERE q.body IS NOT NULL
GROUP BY q.body
HAVING COUNT(1) > 1
) r
JOIN ques s ON s.body = r.body
這些都是我們需要更新的行。爲了使這些行具有唯一性,我們可以爲每個行分配一個新的唯一值到body
列。如果沒有任何「新」值重複表中已經存在的值,我們將擁有唯一的值。
示例更新語句:
-- append unique value to end of each body value
UPDATE (SELECT q.body
FROM ques q
WHERE q.body IS NOT NULL
GROUP BY q.body
HAVING COUNT(1) > 1
) r
JOIN ques s ON s.body = r.body
SET s.body = CONCAT(s.body,'<!--',s.id,'-->');
在這裏,我們「追加」的值,以現有的體值的末尾。我們可以使用表中保證爲非空且唯一的現有列。 AUTO_INCREMENT主鍵列是合適的候選者。 (我們可以讓語句生成一個唯一的整數)
注意:不能保證我們分配給body
的新值與數據庫中已存在的值不同。我們只是識別現有的重複項,然後應用更改以使值彼此唯一。我們真的需要回圈,並再次檢查重複值。
另請注意,此處沒有對body
列的最大長度進行檢查,即每個現有值的末尾是否存在「空間」以附加給定格式的字符串。所以在這裏有改進的空間,檢查現有的body
值的大小(使用LENGTH()
或CHAR_LENGTH()
函數)並將其與列定義進行比較。另外,如果有兩行有重複值,我們實際上只需要更新它們中的一行,而我們可以用現有值保留其中的一行。示例查詢現在不這樣做,但可以做到這一點。
但是這應該足以讓你開始。
當然,一旦您將值設置爲唯一,您需要在此列上添加UNIQUE約束,以防止將來創建重複項。
這說明我們如何讓一行的主體的值保持不變。 (相應的更新語句將分配該IF()
表達到主體列。)
-- show new values for body, leave the value for one row unchanged
SELECT s.id
, s.body AS old_val
, IF(s.id = q.min_id, s.body, CONCAT(s.body,'<!--',s.id,'-->')) AS new_val
FROM (SELECT q.body
, MIN(q.id) AS min_id
FROM ques q
WHERE q.body IS NOT NULL
GROUP BY q.body
HAVING COUNT(1) > 1
) r
JOIN ques s ON s.body = r.body
洛爾@「讀細手冊」 =) – Crontab 2012-07-19 13:55:25
不工作作爲列「身體」是LONGVARCHAR ..是否有任何其他的解決方案。 ? – codeofnode 2012-07-19 14:32:56