【问题标题】:Check if an attribute in a table has a specific value SQL检查表中的属性是否具有特定值 SQL
【发布时间】:2020-03-08 17:00:35
【问题描述】:

我有这张桌子。在“评论”中,我想确保“用户”字段与字段 Reservation.User(进行预订的用户)具有相同的值,其中 Reservation 具有在字段 Review.Id_Reservation 中指定的 id。我怎么能这样做?

CREATE TABLE Reservation
(
Reservation_Number SERIAL UNIQUE /*NOT NULL*/ PRIMARY KEY,
User VARCHAR(64) DEFAULT 'Member', FOREIGN KEY(User) REFERENCES User(Email)
ON UPDATE CASCADE
ON DELETE SET DEFAULT,
Place INT, FOREIGN KEY(Place) REFERENCES Place(Id_Place)
ON UPDATE CASCADE
ON DELETE NO ACTION,
);

CREATE TABLE Review
(
Id_Review SERIAL UNIQUE PRIMARY KEY,
Id_Reservation INT NOT NULL, FOREIGN KEY(Id_Prenotazione) REFERENCES Reservation(Reservation_Number),
User VARCHAR(64) NOT NULL DEFAULT 'Member', FOREIGN KEY(User) REFERENCES Reservation(User)
/*How can I check that this user is the same who made the reservation and not another one? */
Description TEXT,
Stars INT DEFAULT 0
Type BOOLEAN DEFAULT TRUE
Answer VARCHAR(64),
Private BOOLEAN DEFAULT FALSE
CHECK(Stars > 0 AND Stars <= 5)
);

【问题讨论】:

  • 这是查看用户名的唯一方法吗?在我看来,我希望看到用户名也带有“从用户中选择 *”
  • 唯一标准化的,即理智的方式。
  • 如果相应的用户已被删除,我必须在“评论”中有一个字段,该字段假定值为“成员”,以指定谁撰写了评论
  • 我猜预订也会更改为'Member'?那么问题出在哪里?您也可以从预订中获得'Member',而不是以前的用户名。你在这里叫错树了。

标签: sql postgresql create-table


【解决方案1】:

您需要使用已使用Id_Reservation INT NOT NULL, FOREIGN KEY(Id_Prenotazione) REFERENCES Reservation(Reservation_Number) 创建的这些表之间的引用完整性 当您想获取User 时,只需查询Reservation 表而不是Review

Select
a.User
from
reservation a
join
review b
on a.Reservation_Number=b.Id_Reservation;

【讨论】:

  • 如果相应的用户已被删除,我必须在“评论”中有一个字段,该字段假定值为“成员”,以指定谁撰写了评论
  • 如果建立参照完整性,关系数据库就不是这样工作的。如果你想实现你所提到的,你必须独立地插入这些列,然后编写一个查询来查看用户是否相同。当你这样做User VARCHAR(64) NOT NULL DEFAULT 'Member', FOREIGN KEY(User) REFERENCES Reservation(User) 时,这意味着Reservation 表中必须有相应的记录。
猜你喜欢
  • 2022-06-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 2019-04-30
相关资源
最近更新 更多