首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -限制tinyint列

MySQL -限制tinyint列
EN

Stack Overflow用户
提问于 2013-10-30 11:44:40
回答 1查看 969关注 0票数 1

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

代码语言:javascript
复制
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有几个记录.)

EN

回答 1

Stack Overflow用户

发布于 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值。哎呀。:(

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19681321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档