MySQL - 限制tinyint列

时间:2013-10-30 11:44:40

标签: mysql constraints restriction

在MySQL db中,我有一个包含用户地址的表:

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的几条记录......)

1 个答案:

答案 0 :(得分:1)

我遇到了类似的东西...我认为你(我的搜索中可能是我)误认为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))仅影响显示的值,而不影响实际< strong>存储值。 存储的大小由类型本身(MySql Doc

定义

BIT更像是字符串类型,因为长度(BIT(1))定义了存储的数量(如CHAR(5)将存储5个字符) 。所以BIT(1)更类似于真正的布尔值。

出于您的目的,唯一键中的简单无符号TINYINT可能就足够了,除非您预计用户的地址超过255个。但是,由您的应用程序决定将0值行标识为主要地址(哪种类型会扭曲名称is_main的语义,所以也许“address_index”?)。我认为如果允许主要地址改变(这是合乎逻辑的),那将是一个挑战。您可能需要使用触发器设置一些控件,以便当地址记录设置为“main”(0)时,该用户的所有其他控件将更新为不同的非0值。的Bleh。 :(