Php mysql服务器不接受id和datetime作为新记录
我有一个表,其中主键是一个无符号的大int作为ID,然后是一个datetime变量,该变量被设置为YYYY-MM-DD HH-MM-SS 我是从下面的评论中得到这个想法的: 我遇到的问题是,当我尝试插入具有相同ID但不同日期时间的新记录时,我收到一个错误,表示违反了重复ID的主键约束 我猜MySQL只是比较datetime数据类型的YYYY-MM-DD部分,因为它在进行字符串比较,但我不确定。。。这只是我的理论 我希望那些使用datetime作为主键的人能有所了解 php代码是正确的,因为显然正在创建第一条记录,但没有创建具有相同ID的第二条记录 我试图不显示我的SQL代码,但它在这里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代码是正确的,因为显然
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回显日期时间来检查确切的原因,他们不一样是的,你们搞定了,我昨晚很晚才弄明白。谢谢你的洞察力