2017-01-23 53 views
0

我有一列數據超過了MySQL的索引長度限制。因此,我不能使用唯一的密鑰。MySQL:強制一個獨特的列而不使用唯一的密鑰

這裏有一個解決問題的方法,而無需使用一個唯一的密鑰:MySQL: Insert record if not exists in table

與插入相同的數值爲多列。然而,在評論中,人們有問題。就我而言,我的很多值是0,所以我會經常得到重複值。

我使用Node和node-mysql來訪問數據庫。我在想我可以有一個變量來跟蹤當前正在插入的所有值。在插入之前,我檢查當前是否正在插入值。如果是這樣,我會等待直到它完成插入,然後繼續執行,就像該值最初插入一樣。但是,我覺得這會很容易出錯。

這裏是我的表架構的一部分:

CREATE TABLE `links` (
    `id` int(10) UNSIGNED NOT NULL, 
    `url` varchar(2083) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL, 
    `likes` int(10) UNSIGNED NOT NULL, 
    `tweets` int(10) UNSIGNED NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 

ALTER TABLE `links` 
    ADD PRIMARY KEY (`id`), 
    ADD KEY `url` (`url`(50)); 

我不能把url的唯一關鍵,因爲它可以是2083個字節,這是對MySQL的主要大小限制。 likestweets通常是0,所以鏈接的解決方案將不起作用。

是否有另一種可能的解決方案?

+0

您可以使用'BEFORE INSERT'觸發器來檢查URL是否已經存在,併發出錯誤信號。 – Barmar

回答

1

如果短語的INSERT以某種方式,你可以利用WHERE NOT EXISTS首先要檢查是否URL沒有完成插入之前存在:

INSERT INTO links (`url`, `likes`, `tweets`) 
SELECT 'http://www.google.com', 10, 15 FROM DUAL 
WHERE NOT EXISTS 
(SELECT 1 FROM links WHERE url='http://www.google.com'); 

這假定id列是主鍵/自動增量,MySQL將自動爲其分配一個值。