1

在 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...)

4

1 回答 1

1

我在寻找类似的东西时遇到了这个......我认为你(可能是我在搜索中)误TINYINT(1)认为BIT(1).

请参见此处:MySQL Boolean "tinyint(1)" 的值最高为 127?

在这里:我的sql中“int”和“int(3)”数据类型之间的区别

TINYINT是字节存储类型(与其他整数一样),其中定义长度 ( TINYINT(1)) 仅影响显示的值,而不影响实际存储的值。存储的大小由类型本身定义(MySql Doc

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

出于您的目的,唯一密钥中的简单未签名TINYINT可能就足够了,除非您预计用户拥有超过 255 个地址。但是,由您的应用程序将 0 值行标识为主地址(这有点扭曲 name 的语义is_main,所以可能是“ address_index”?)。我认为即使允许更改主地址(这是合乎逻辑的),这也是一个挑战。您可能需要使用触发器设置一些控件,以便当地址记录设置为“main”(0) 时,该用户的所有其他控件都将更新为不同的非 0 值。呜呜。:(

于 2014-01-30T18:00:54.643 回答