在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
的几条记录......)
答案 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。 :(