在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_main仅为每个用户一次1,以指示主用户的地址。所有其他用户的地址都有is_main = 0。
这能在MySQL级别上被限制吗?
(ALTER TABLE user_address ADD UNIQUE INDEX is_main (is_main, user_id);没有提供帮助,因为is_main=0有几个记录.)
发布于 2014-01-30 18:00:54
我偶然发现这是在寻找类似的东西..。我认为你(很可能是我在搜索中)把TINYINT(1)误认为是BIT(1)。
见此处:MySQL布尔值"tinyint(1)“最多保存127个值?
在这里:"int“和"int(3)”数据类型在我的sql中的区别
TINYINT是一个字节存储类型(和其他ints一样),其中定义长度(TINYINT(1))只影响显示的值,而不是实际的存储的值。存储的大小由类型本身(MySql医生)定义。
BIT更像是字符串类型,长度(BIT(1))定义了存储了多少(比如CHAR(5)会存储5个字符)。因此,BIT(1)更像是一个真正的布尔值。
就您的目的而言,在唯一键中使用一个简单的无符号TINYINT可能就足够了,除非您预期用户有超过255个地址。但是,您的应用程序将把0值行标识为主地址(这有点扭曲了名称is_main的语义,所以可能是"address_index"?)。我认为这将是一个挑战,即使到那时,主地址被允许改变(这是合乎逻辑的)。您可能需要使用触发器设置一些控件,以便当地址记录设置为"main“(0)时,该用户的所有其他控件都会更新为不同的非0值。哎呀。:(
https://stackoverflow.com/questions/19681321
复制相似问题