1

我有这张表,其中主键是一个无符号大整数作为 ID 的组合,然后是一个设置为 YYYY-MM-DD HH-MM-SS 的日期时间变量

我从以下评论中得到了这个想法: MySQL:使用 DATETIME 作为主键

我遇到的问题是,当我尝试插入一条 ID 相同但日期时间不同的新记录时,我收到一条错误消息,指出违反了重复 ID 的主键约束。

我的猜测是 MySQL 只比较日期时间数据类型的 YYYY-MM-DD 部分,因为它正在进行字符串比较,但我不确定......这只是我的理论。

我希望将日期时间用作主键一部分的人会有一些见识。

php 代码是正确的,因为显然正在创建第一条记录,但没有创建具有相同 ID 的第二条记录。

我试图不显示我的 SQL 代码,但在这里

    CREATE TABLE userPosts(
    postID      SERIAL          NOT NULL,
    username    varchar(21)     NOT NULL,
    time        datetime        NOT NULL,
    text        varchar(500),
    type        varchar(1)      NOT NULL    CHECK(type='t' OR type='f' OR type='u' OR type='b' OR type='c'),
    -- visits       integer         NOT NULL    DEFAULT 0,

    CONSTRAINT FK_users_userPosts   FOREIGN KEY(username)   REFERENCES users(username) ON DELETE CASCADE,
    CONSTRAINT PK_userPosts_username_postID_time    PRIMARY KEY(postID,time)
    );

我正在使用层次模型,该表将被描述为 ISA 表。

哇,我认为这是因为我将 ID 分配为我认为是唯一的 SERIAL 数据类型...我将不得不重新实现我的 php 以自动增加 ID 而不是数据库这样做。

我将重新实现我的代码并让你们发布。

4

3 回答 3

0

您描述的错误意味着日期根本不是您的主键的一部分。

您应该检查您是如何创建表和当前模式的,以检查它是否已正确完成。

MySQL 没有理由仅在 YYYY MM DD 上进行比较,它会比较任何内容。如果您有任何疑问,有时将日期存储为 Unix 时间戳并使用 PhP 为您的输出重新处理它们会更容易,请考虑一下。

于 2013-08-23T05:29:48.090 回答
0

不,MySql 使用整个datetime列作为键的一部分,假设您已正确设置它。

因此,您可能没有正确设置它。建议您发布您的表格规格(或create table您使用的命令),以便我们告诉您哪里出错了。

此外,您应该展示您是如何插入数据的,因为这也可能是一个问题(例如,如果它因为您insert的错误而忽略了时间部分)。


既然您已经展示create table命令,那么至少有一个问题在于serial数据类型的使用。这是一个别名:

BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE

so 本身被认为是唯一的,无论它是否是主键的一部分。

这意味着任何行都不能具有相同的值,postID即使它具有不同的time值。如果您没有明确设置该列或者将其设置为 0 或 null(因为此时自动增量将启动),那将不是问题,但如果您尝试这样做,它会咬你设置一个已经存在的显式值。

BIGINT UNSIGNED NOT NULL如果您想显式设置它并允许在该列上重复,您应该将其更改为类似的内容。然后主键约束将处理组合postID time`and列中的重复项。

于 2013-08-23T05:32:43.310 回答
0

只需在创建表查询中更改 SERIAL TO BIGINT 即可,它会按照您的预期工作。

问题不在于时间(日期时间)字段,问题在于 postId(SERIAL)。当您使用 SERIAL 时,该列变为自动递增。由于在您的第二个查询中,您传递了表中已经存在的 postID 的值之一,因此它给出了错误。

于 2013-08-23T06:44:39.990 回答