mysql - 如何添加可为空的列作为表的主组合键的一部分?

标签 mysql sql

我们有一个包含生产数据的表格:

CREATE TABLE VerifiedUsers (
    Mobile varchar(20) NOT NULL,
    Email varchar(255) NOT NULL,
    Name varchar(255),
    PRIMARY KEY (Mobile,Email)
);

我们有一个新要求,需要在此表中保存用户的唯一设备 ID,以便我们根据(手机、电子邮件、DeviceId)而不是(手机、电子邮件)唯一地识别用户。

这个新列 DeviceId 必须为 Nullable,因为我们无法确保每个客户端都会向我们发送 DeviceId。另一方面,我们必须将其作为主键的一部分,因为我们现在可以拥有具有相同(手机、电子邮件)但不同 DeviceId 的多行。

我们应该如何解决这个问题。我们是否应该通过为 DeviceId 提供一些默认值(以防它为空)来解决这个问题?

最佳答案

我建议:

CREATE TABLE VerifiedUsers (
    VerifiedUserId int auto_increment primary key,
    Mobile varchar(20) NOT NULL,
    Email varchar(255) NOT NULL,
    DeviceId varchar(255),  -- or whatever
    Name varchar(255),
    UNIQUE (Mobile, Email, DeviceId)
);

主键的组成部分不能为空。将单个自动增量列作为主键很方便,原因有很多:

  • 对于外键引用很有用。
  • 跟踪插入顺序。
  • 仅使用 4 个字节(如果表非常非常大,则使用 8 个字节)。

关于mysql - 如何添加可为空的列作为表的主组合键的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50279752/

相关文章:

php - 带进度条的 CSV 导入

mysql - 如何在 SQL 中为贝叶斯网络建模,或者更一般地说,为有向加权图建模?

mysql - 色谱柱的最佳用途是什么?

mysql - mysql数据库中外键和触发器的基本使用

javascript - Web SQL 向多行插入数据

SQL 组合 SELECT 语句

mysql - 从 InnoDB 中删除行非常慢

mysqld 未知选项 '--ndbcluster'

mysql - 比较 mysql 中的两个表列结果重复

php - 如何自动更新phpmyadmin中的列