1

我的数据库中有两个表,其架构如下:

locations (
location_id INT PRIMARY KEY,
location VARCHAR
)

venues (
venue_id INT PRIMARY KEY,
venue VARCHAR,
venue_location INT FOREIGN KEY locations(location_id)
ON DELETE CASCADE
)

当我需要删除位置而不是场地时,会出现一个大问题。如何仅删除位置但不删除具有相同location_id. 我应该怎么做才能达到这个要求。

示例数据:

/*locations table and data*/
locations(1, "Kathmandu");
locations(2, "Ilam");
locations(3, "Fikkal");

/*venues table and data*/
venues(1, "Green View Hotel and Lodge", 2);
venues(2, "Hyatt Hotel and Lodge", 1);
venues(3, "Abc Hotel", 3);

如何在locations不影响venues“Abc Hotel”的情况下删除“Fikkal”位置。我知道 ON DELETE CASCADE 正在从场所中删除该行,而我删除了相同 ID 的位置。但是如果我删除了 ON DELETE CASCADE mysql 说 FK 约束失败并且它也很明显。你会如何解决这样的问题。

我正在考虑的解决方案是locations在下表中创建一个默认位置,如下所示:

位置(0,“默认位置”);

并执行类似ON DELETE SET DEFAULT但真的不知道如何。

但我认为有一些方法可以解决这个问题professionalstandard请有任何想法。

谢谢

4

3 回答 3

0

您可以允许 null forvenue_location和 on delete 设置为 null。显然也可以有其他解决方案。但这在您的情况下似乎是最简单的。

于 2013-07-22T05:21:48.383 回答
0

好吧,如果场地没有找到位置,您可能会知道如何处理其余功能。

如果您希望能够删除连接了场地的位置,您只需执行以下操作:

venues (
    venue_id INT PRIMARY KEY,
    venue VARCHAR,
    venue_location INT FOREIGN KEY locations(location_id)
    ON DELETE NO ACTION
)     

我的意思是用“NO ACTION”替换“CASCADE”

于 2013-07-22T05:23:29.030 回答
0

假设如果你想在删除父记录后添加 location id 1 作为默认值,那么我们必须写 default 1

场地(场地 ID INT PRIMARY KEY,场地 VARCHAR,场地位置 INT 默认 1 外键位置(位置 ID)ON DELETE SET DEFAULT)

于 2020-06-06T05:55:43.383 回答