gpt4 book ai didi

MySQL - 限制 tinyint 列

转载 作者:行者123 更新时间:2023-11-29 00:24:19 27 4
gpt4 key购买 nike

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

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 级别上进行限制?

(修改表用户地址
ADD UNIQUE INDEX is_main (is_main, user_id);
没有帮助,因为有几条记录 is_main=0...)

最佳答案

我在寻找类似的东西时发现了这个...我认为您(在我的搜索中可能还有我)将 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)) 仅影响显示 值,而不是实际的存储 值。 存储 大小由类型本身定义 ( MySql Doc )

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

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

关于MySQL - 限制 tinyint 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19681321/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com