2012-07-19 96 views
-1

我在mysql數據庫中有一個表QUES如何在MySQL表中創建一個唯一的列?

該表有一列BODY,目前它不是唯一的。

表中有很多這些我肯定目前BODY是唯一的性質,但沒有定義爲屬性。

我該如何更新列號爲BODY的唯一定義爲屬性?

有人可以建議正確的SQL查詢相同嗎?

感謝

回答

0
ALTER TABLE QUES ADD UNIQUE (BODY). 

閱讀精細的手工here

+0

洛爾@「讀細手冊」 =) – Crontab 2012-07-19 13:55:25

+0

不工作作爲列「身體」是LONGVARCHAR ..是否有任何其他的解決方案。 ? – codeofnode 2012-07-19 14:32:56

0

以下是一些可幫助您入門的示例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 
相關問題