MySQL和PHP,用于引用某个内容的注释表的唯一ID

MySQL和PHP,用于引用某个内容的注释表的唯一ID,php,mysql,Php,Mysql,我不知道标题是否正是我想解释的,我的英语水平很低。但我解释自己:我有一个MySQL表来存储新闻表的评论: news_comments: id INT, AI id_new INT name VARCHAR comment TEXT 但我希望每个新评论都有一个唯一的编号。所以对于id_new=1,我有一个#1,#2,#3。。。id#u new=2另一个#1,#2,#3 如果我从id#u new=1中删除注释#1,#2将保留#2,下一条注释(如果存在#2和#3)将为#4。如果删除#4,新评论将为

我不知道标题是否正是我想解释的,我的英语水平很低。但我解释自己:我有一个MySQL表来存储新闻表的评论:

news_comments:

id INT, AI
id_new INT
name VARCHAR
comment TEXT
但我希望每个新评论都有一个唯一的编号。所以对于id_new=1,我有一个#1,#2,#3。。。id#u new=2另一个#1,#2,#3

如果我从id#u new=1中删除注释#1,#2将保留#2,下一条注释(如果存在#2和#3)将为#4。如果删除#4,新评论将为#5

我该怎么办


提前谢谢你

首先,将您的唯一号码存储在
id
的单独字段中。例如,
uid INT
,其约束为
UNIQUE(id\u new,uid)
id
是并且应该保持一个自动递增的标识符字段,因为它将使您的生活更加轻松(例如,您可以使用一个标识符而不是两个标识符访问您的注释)

最简单的方法是保留删除的注释(使用
is\u deleted
字段),并使用MAX()查找到目前为止为给定
is\u new
分配的最大标识符


另一种可能是跟踪
news
表本身中先前分配的
uid
s,但这需要更多的工作和对每个新注释的额外更新

首先,将您的唯一号码存储在
id
的单独字段中。例如,
uid INT
,其约束为
UNIQUE(id\u new,uid)
id
是并且应该保持一个自动递增的标识符字段,因为它将使您的生活更加轻松(例如,您可以使用一个标识符而不是两个标识符访问您的注释)

最简单的方法是保留删除的注释(使用
is\u deleted
字段),并使用MAX()查找到目前为止为给定
is\u new
分配的最大标识符


另一种可能是跟踪
news
表本身中先前分配的
uid
s,但这需要更多的工作和对每个新注释的额外更新

通常情况下,自动增量字段也是主键,但不必如此。可以将主键设为复合索引(多个列)。然后,自动递增将从第一列开始递增,给出您要查找的内容。但是,您的表不包含与新闻项相关的id,您需要该id才能执行此操作

CREATE TABLE news_comments (
news_id INT,
comment_id INT AUTO_INCREMENT,
name VARCHAR, comment TEXT,
PRIMARY KEY commment_key (news_id, comment_id)
);

如果新闻id为1,则注释id将从1开始递增,对于每个唯一的新闻id,注释id将从1开始。

通常,自动递增字段也是主键,但不必如此。可以将主键设为复合索引(多个列)。然后,自动递增将从第一列开始递增,给出您要查找的内容。但是,您的表不包含与新闻项相关的id,您需要该id才能执行此操作

CREATE TABLE news_comments (
news_id INT,
comment_id INT AUTO_INCREMENT,
name VARCHAR, comment TEXT,
PRIMARY KEY commment_key (news_id, comment_id)
);

如果新闻id为1,则注释id将从该值开始递增,对于每个唯一的新闻id,注释id将从1开始。

不,您不需要它。事实上,这根本不是一个数字。别管它了,我同意弹片上校的说法。你把“逻辑”放进主键,这几乎总是个坏主意。为什么你认为你需要这样做?为什么你有一个新的领域?它与另一张桌子有关吗?在这种情况下,您的id字段将是唯一的。我不知道我的解释是否正确,我的英语不好。当我显示评论时,我需要一个“顺序”编号。用户在评论时引用其他评论,如“我喜欢评论#5”。因此,如果您正在执行递增数字的for/foreach,如果您删除#4,那么#5现在将成为#4。你有主意吗?非常感谢。你的英语很好。你的目标是错误的。你不需要序列号。至少在那个id字段中。若要枚举注释,可以在输出时使用单独的变量进行枚举。而唯一标识符应保持唯一。明白吗?不,你不想要。事实上,这根本不是一个数字。别管它了,我同意弹片上校的说法。你把“逻辑”放进主键,这几乎总是个坏主意。为什么你认为你需要这样做?为什么你有一个新的领域?它与另一张桌子有关吗?在这种情况下,您的id字段将是唯一的。我不知道我的解释是否正确,我的英语不好。当我显示评论时,我需要一个“顺序”编号。用户在评论时引用其他评论,如“我喜欢评论#5”。因此,如果您正在执行递增数字的for/foreach,如果您删除#4,那么#5现在将成为#4。你有主意吗?非常感谢。你的英语很好。你的目标是错误的。你不需要序列号。至少在那个id字段中。若要枚举注释,可以在输出时使用单独的变量进行枚举。而唯一标识符应保持唯一。明白了吗?+1:为什么人们要-2你的答案?这就是MyISAM表的答案。也许您应该更改为使用OP列名:
create table news\u comments(id int auto\u increment,id\u new int,name varchar(255),comment text,primary key(id\u new,id))engine=myisam是,它仅适用于MyISAM表。我应该澄清一下。+1:为什么人们-2会回答你的问题?这就是MyISAM表的答案。也许您应该更改为使用OP列名:
create table news\u comments(id int auto\u increment,id\u new int,name varchar(255),comment text,primary key(id\u new,id))engine=myisam是,它仅适用于MyISAM表。我应该澄清一下。