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

时间:2018-05-10 18:56:50

标签: 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提供一些默认值来解决它,以防它为空吗?

2 个答案:

答案 0 :(得分:0)

我建议:

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个字节)。

答案 1 :(得分:0)

在这种情况下,默认值不会比保持null更有帮助。无论哪种方式,这两个值都无助于识别用户。自动增量主键将是一个理想的解决方案,但只有在您的情况下才允许这样做。