Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql服务器不接受id和datetime作为新记录_Php_Mysql_Sql_Datetime - Fatal编程技术网

Php mysql服务器不接受id和datetime作为新记录

Php mysql服务器不接受id和datetime作为新记录,php,mysql,sql,datetime,Php,Mysql,Sql,Datetime,我有一个表,其中主键是一个无符号的大int作为ID,然后是一个datetime变量,该变量被设置为YYYY-MM-DD HH-MM-SS 我是从下面的评论中得到这个想法的: 我遇到的问题是,当我尝试插入具有相同ID但不同日期时间的新记录时,我收到一个错误,表示违反了重复ID的主键约束 我猜MySQL只是比较datetime数据类型的YYYY-MM-DD部分,因为它在进行字符串比较,但我不确定。。。这只是我的理论 我希望那些使用datetime作为主键的人能有所了解 php代码是正确的,因为显然

我有一个表,其中主键是一个无符号的大int作为ID,然后是一个datetime变量,该变量被设置为YYYY-MM-DD HH-MM-SS

我是从下面的评论中得到这个想法的:

我遇到的问题是,当我尝试插入具有相同ID但不同日期时间的新记录时,我收到一个错误,表示违反了重复ID的主键约束

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

我希望那些使用datetime作为主键的人能有所了解

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指定为串行数据类型,我认为它是唯一的。。。我必须将我的php重新实现为自动增量ID,而不是由数据库执行


我将重新实现我的代码,并让你们保持联系

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

您应该检查如何创建表和当前架构,以检查是否正确创建


MySQL没有理由只在YYYY-MM-DD上进行比较,它会比较任何东西。如果您有任何疑问,可以将日期存储为Unix时间戳,并使用PhP对其进行修改以获得输出,这有时会更容易。请仔细想想。

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

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

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


现在您已经显示了
createtable
命令,使用
serial
数据类型至少存在一个问题。这是的别名:

BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
因此被认为是唯一的,不管它是否是主键的一部分

这意味着,即使具有不同的
时间
值,
postID
的行也不能具有相同的值。如果您没有显式设置该列,或者将其设置为0或null(因为自动增量将在该点生效),那么这不会是一个问题,但是如果您试图设置一个已经存在的显式值,它会对您造成影响


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

只需在create table query中将SERIAL更改为BIGINT,它将按照您的期望工作


问题不在于时间(datetime)字段,而在于postId(串行)。使用串行时,列将自动递增。由于在第二次查询中,您传递的是表中已存在的postID的一个值,因此给出了错误。

SHOW CREATE table yourtable的输出是什么?
?如果在id和datetime列上都添加主键,则id和日期时间的组合可能不唯一,您可以将id设置为自动递增。因此,即使两个东西的插入间隔不到1秒(这将导致重复的datetime),由于id的原因,它仍然是唯一的。但是为什么还要在主键中包含datetime呢?相反,只需在datetime和id上设置一个非唯一键作为主键。您确定相同id的两个日期实际上是不同的吗?建议:删除主键并重新运行查询。然后看看数据库里放了什么。也许你每次都要执行两次,而不是一次,但你没有意识到。我让php回显日期时间来检查确切的原因,他们不一样是的,你们搞定了,我昨晚很晚才弄明白。谢谢你的洞察力