2013-10-30 73 views
1

在MySQL數據庫,我有與用戶的地址表:MySQL的 - 限制TINYINT列

CREATE TABLE `user_address` (
    `id` INT(10) NOT NULL AUTO_INCREMENT, 
    `user_id` INT(10) NOT NULL, 
    `street` VARCHAR(50) NULL DEFAULT NULL, 
    `number` VARCHAR(255) NULL DEFAULT NULL, 
    `city` VARCHAR(255) NULL DEFAULT NULL, 
    `zip` VARCHAR(255) NULL DEFAULT NULL, 
    `is_main` TINYINT(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
) 

每個用戶地址的數量不限,但我想is_main1每個用戶只有一次,以指示主要用戶的地址。所有其他用戶的地址將有is_main = 0

這可以限制在MySQL級別上嗎?

ALTER TABLE user_address ADD UNIQUE INDEX is_main (is_main, user_id);沒有幫助,因爲有幾條記錄與is_main=0 ...)

+0

我不認爲這是可能的,就像你說自己你可以在'is_main,user_id'上創建一個唯一索引,但是你只能有2個地址然後(一個是is_main = 1,另一個是is_main = 0 ),那麼你需要以另一種方式限制它,例如在你的代碼中。在插入它之前,請檢查是否有任何含有is_main = 1的行。 – davey

回答

0

我碰到這個尋找類似的東西...我想你(可能我在我的搜索)被誤認TINYINT(1)BIT(1)

在這裏看到:MySQL Boolean "tinyint(1)" holds values up to 127?

和這裏:Difference between "int" and "int(3)" data types in my sql

TINYINT是一個字節的存儲類型(是其他整數),其中,限定的長度(TINYINT(1))僅影響顯示值,不是存儲的值。所述存儲大小由類型本身(MySql Doc

BIT更像在該字符串類型長度(BIT(1))定義多少會定義存儲(如CHAR(5)將存儲恰好5個字符)。所以BIT(1)更類似於真正的布爾值。

出於您的目的,除非您預計用戶擁有超過255個地址,否則在唯一密鑰中使用簡單的未簽名TINYINT可能就足夠了。然而,將由你的應用程序來確定0值行作爲主地址(哪一種會歪曲名稱is_main的語義,因此可能是「address_index」?)。我認爲如果允許主地址改變(這是合乎邏輯的),那麼即使這樣也是一個挑戰。您可能需要使用觸發器設置一些控件,以便當地址記錄設置爲「main」(0)時,該用戶的所有其他用戶都會更新爲不同的非0值。的Bleh。 :(