Sql 防止在数据库中使用重复标记的步骤

Sql 防止在数据库中使用重复标记的步骤,sql,database,ddl,Sql,Database,Ddl,我想知道如何防止在数据库表中使用两个相同的标记。 有人说我在一个表中使用两个私钥。然而,W3Schools网站说这是不可能的 我的关系表 我的逻辑表 表格的上下文 如何防止在问题中使用重复的标记?您可以在标记表中的(问题id、标记名称)上创建唯一约束,以确保该对是唯一的。这意味着同一个问题可能不会多次附加相同的标签。但是,相同的标记仍然可以应用于不同的问题。您可以在标记表中对(问题id、标记名称)创建唯一的约束,这将确保该对是唯一的。这意味着同一个问题可能不会多次附加相同的标签。但是,相同

我想知道如何防止在数据库表中使用两个相同的标记。 有人说我在一个表中使用两个私钥。然而,W3Schools网站说这是不可能的

我的关系表

我的逻辑表

表格的上下文


如何防止在问题中使用重复的标记?

您可以在标记表中的(问题id、标记名称)上创建唯一约束,以确保该对是唯一的。这意味着同一个问题可能不会多次附加相同的标签。但是,相同的标记仍然可以应用于不同的问题。

您可以在标记表中对(问题id、标记名称)创建唯一的约束,这将确保该对是唯一的。这意味着同一个问题可能不会多次附加相同的标签。但是,相同的标记仍然可以应用于不同的问题。

您不能创建两个主键,但可以在索引上放置唯一性约束。

您不能创建两个主键,但可以在索引上放置唯一性约束。

您只能有一个主键(我假设这就是您所说的“私钥”),但该键可以是由问题id和标记名组成的组合键。在SQL中,它看起来像(取决于您的SQL方言):


这将确保您不能对同一个问题使用相同的标记。

您只能有一个主键(我假设这就是您所说的“私钥”的意思),但该键可以是由问题id和标记名组成的组合键。在SQL中,它看起来像(取决于您的SQL方言):


这将确保您不能对同一个问题使用相同的标记。

我将使用PostgreSQL或Oracle。

我觉得下面的代码与Ken针对MySQL的代码相对应

CREATE TABLE Tags 
     (
         QUESTION_ID integer FOREIGN KEY REFERENCES Questions(QUESTION_ID) 
                             CHECK (QUESTION_ID>0), 
         TAG_NAME nvarchar(20) NOT NULL,
         CONSTRAINT no_duplicate_tag UNIQUE (QUESTION_ID,TAG_NAME)
     )
我在查询中添加了一些额外的度量。例如,
CHECK(USER\u ID>0)
用于确保数据库中没有损坏的数据

我从这个
问题ID
中删除了
自动增量
,因为我发现它会破坏我们的系统,因为一个问题不能有两个故意选择的标签。在其他情况下,标签会混淆


我发现我们需要给约束命名。它的名称是命令中的无重复标记。

我将使用PostgreSQL或Oracle。

我觉得下面的代码与Ken针对MySQL的代码相对应

CREATE TABLE Tags 
     (
         QUESTION_ID integer FOREIGN KEY REFERENCES Questions(QUESTION_ID) 
                             CHECK (QUESTION_ID>0), 
         TAG_NAME nvarchar(20) NOT NULL,
         CONSTRAINT no_duplicate_tag UNIQUE (QUESTION_ID,TAG_NAME)
     )
我在查询中添加了一些额外的度量。例如,
CHECK(USER\u ID>0)
用于确保数据库中没有损坏的数据

我从这个
问题ID
中删除了
自动增量
,因为我发现它会破坏我们的系统,因为一个问题不能有两个故意选择的标签。在其他情况下,标签会混淆


我发现我们需要给约束命名。在命令中,它的名称是
no\u duplicate\u tag

我已经更新了我的NORMA模型,以便更接近您的图表。我可以看出您犯了一些错误,但其中一些可能是由于我以前的模型

我已更新此模型以防止重复标记。以前这并不重要。但既然你想要它,它就在这里(对于博士后):

请注意,现在有一个单独的标记表,
Tag\u ID
作为主键
TAG_NAME
是一个单独的列,上面有唯一性约束,防止重复标记。
QuestionTaggedTag
表现在有(
QUESTION\u ID
TAG\u ID
),这也是它的主键


我希望我在回答这个问题时没有走得太远,但当我试图写更小的答案时,我不得不不断地解开我先前的答案,而仅仅发布这个答案似乎更简单。

我已经更新了我的NORMA模型,以便更紧密地匹配您的图表。我可以看出您犯了一些错误,但其中一些可能是由于我以前的模型

我已更新此模型以防止重复标记。以前这并不重要。但既然你想要它,它就在这里(对于博士后):

请注意,现在有一个单独的标记表,
Tag\u ID
作为主键
TAG_NAME
是一个单独的列,上面有唯一性约束,防止重复标记。
QuestionTaggedTag
表现在有(
QUESTION\u ID
TAG\u ID
),这也是它的主键


我希望我在回答这个问题时没有走得太远,但当我试图写更小的答案时,我不得不不断地解开我先前的答案,而仅仅发布这个似乎更简单。

谢谢你的回答!——请参阅我尝试将您的代码转换为PostgreSQL或Oracle。谢谢您的回答请看我试图将您的代码转换为PostgreSQL或Oracle。请看我试图在上面创建这样的约束。您的意思是这样吗?请看我试图在上面创建这样的约束。您的意思是这样吗?谢谢您的回答我会玩一段时间:)顺便说一句,我用的诺玛的所有部分都是最简单的部分。如果你想学习,教程就在他们的网站上:你的意思似乎是数据库仍然需要更新和删除查询。-谢谢你的链接!你是否回应了错误的评论?我没有说过任何关于查询的事情。@Masi:不是查询。还记得你在另一个问题中喜欢的图表吗?这是一个简单的对象角色建模图。我用来回答这个问题的方法也很简单。我是说你可以很快学会诺玛的这一部分。因为诺玛一直在为我提供我发布的答案,如果你学会了,你会有你自己的答案。谢谢你的答案我会玩一会儿这个
START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE;

CREATE SCHEMA so;

SET search_path TO SO,"$user",public;

CREATE DOMAIN so.HashedPassword AS 
    BIGINT CONSTRAINT HashedPassword_Unsigned_Chk CHECK (VALUE >= 0);

CREATE TABLE so."User"
(
    USER_ID SERIAL NOT NULL,
    USER_NAME CHARACTER VARYING(50) NOT NULL,
    EMAIL_ADDRESS CHARACTER VARYING(256) NOT NULL,
    HASHED_PASSWORD so.HashedPassword NOT NULL,
    OPEN_ID CHARACTER VARYING(512),
    A_MODERATOR BOOLEAN,
    LOGGED_IN BOOLEAN,
    HAS_BEEN_SENT_A_MODERATOR_MESSAGE BOOLEAN,
    CONSTRAINT User_PK PRIMARY KEY(USER_ID)
);

CREATE TABLE so.Question
(
    QUESTION_ID SERIAL NOT NULL,
    TITLE CHARACTER VARYING(256) NOT NULL,
    WAS_SENT_AT_TIME TIMESTAMP NOT NULL,
    BODY CHARACTER VARYING NOT NULL,
    USER_ID INTEGER NOT NULL,
    FLAGGED_FOR_MODERATOR_REMOVAL BOOLEAN,
    WAS_LAST_CHECKED_BY_MODERATOR_AT_TIME TIMESTAMP,
    CONSTRAINT Question_PK PRIMARY KEY(QUESTION_ID)
);

CREATE TABLE so.Tag
(
    TAG_ID SERIAL NOT NULL,
    TAG_NAME CHARACTER VARYING(20) NOT NULL,
    CONSTRAINT Tag_PK PRIMARY KEY(TAG_ID),
    CONSTRAINT Tag_UC UNIQUE(TAG_NAME)
);

CREATE TABLE so.QuestionTaggedTag
(
    QUESTION_ID INTEGER NOT NULL,
    TAG_ID INTEGER NOT NULL,
    CONSTRAINT QuestionTaggedTag_PK PRIMARY KEY(QUESTION_ID, TAG_ID)
);

CREATE TABLE so.Answer
(
    ANSWER_ID SERIAL NOT NULL,
    BODY CHARACTER VARYING NOT NULL,
    USER_ID INTEGER NOT NULL,
    QUESTION_ID INTEGER NOT NULL,
    CONSTRAINT Answer_PK PRIMARY KEY(ANSWER_ID)
);

ALTER TABLE so.Question 
    ADD CONSTRAINT Question_FK FOREIGN KEY (USER_ID) 
    REFERENCES so."User" (USER_ID) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE so.QuestionTaggedTag 
    ADD CONSTRAINT QuestionTaggedTag_FK1 FOREIGN KEY (QUESTION_ID) 
    REFERENCES so.Question (QUESTION_ID) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE so.QuestionTaggedTag 
    ADD CONSTRAINT QuestionTaggedTag_FK2 FOREIGN KEY (TAG_ID) 
    REFERENCES so.Tag (TAG_ID) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE so.Answer 
    ADD CONSTRAINT Answer_FK1 FOREIGN KEY (USER_ID) 
    REFERENCES so."User" (USER_ID) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE so.Answer 
    ADD CONSTRAINT Answer_FK2 FOREIGN KEY (QUESTION_ID) 
    REFERENCES so.Question (QUESTION_ID) ON DELETE RESTRICT ON UPDATE RESTRICT;

COMMIT WORK;