Sql 删除外键行时如何在数据库中保留条目

Sql 删除外键行时如何在数据库中保留条目,sql,ruby,Sql,Ruby,我的数据库设置如下: CREATE TABLE farms ( id SERIAL8 primary key, name VARCHAR(255) not null, address VARCHAR(255), phone_num VARCHAR(255) ); CREATE TABLE products ( id SERIAL8 primary key, name VARCHAR(255) not null, description VARCHAR(255),

我的数据库设置如下:

CREATE TABLE farms
(
  id SERIAL8 primary key,
  name VARCHAR(255) not null,
  address VARCHAR(255),
  phone_num VARCHAR(255)
);

CREATE TABLE products
(
  id SERIAL8 primary key,
  name VARCHAR(255) not null,
  description VARCHAR(255),
  stock FLOAT,
  cost FLOAT,
  price FLOAT,
  farm_id INT8 references farms(id)
)
我遇到的问题是,当我删除一个服务器场时,它也会删除该服务器场中可用的所有产品,但我只想删除该服务器场,而不想删除该产品

这是我删除农场的方法

  def delete
    sql = "DELETE FROM farms WHERE id = $1"
    values = [@id]
    SqlRunner.run(sql, values)
  end

是我如何构建表的问题,还是我的SQL语句不正确?

mysql SQL server postgresql。我删除了相互冲突的标签,请添加相关的标签。你为什么要这样做?如果您不想删除产品,那么必须关闭级联(或RDBMS等效功能),但是,引用不存在的外键的
外键
是不受信任的外键,因此是毫无意义的
外键
。您看到的行为是经过设计的。不删除产品将导致孤立记录,这可能会浪费空间,使数据库效率低下,甚至返回错误的结果。我建议你阅读一些数据库设计教程。也许你想要一个产品和农场的链接表,这样一个产品就可以独立存在,没有、一个或多个农场生产它?还是每种产品都是农场特有的?在这种情况下,如果农场倒闭,保留产品是没有意义的。大多数sql数据库允许其他行为,例如,您可以尝试删除集NULLmysql sql server postgresql。我删除了相互冲突的标签,请添加相关的标签。你为什么要这样做?如果您不想删除产品,那么必须关闭级联(或RDBMS等效功能),但是,引用不存在的外键的
外键
是不受信任的外键,因此是毫无意义的
外键
。您看到的行为是经过设计的。不删除产品将导致孤立记录,这可能会浪费空间,使数据库效率低下,甚至返回错误的结果。我建议你阅读一些数据库设计教程。也许你想要一个产品和农场的链接表,这样一个产品就可以独立存在,没有、一个或多个农场生产它?还是每种产品都是农场特有的?在这种情况下,如果农场倒闭,保留产品是没有意义的。大多数sql数据库允许其他行为,例如,您可以尝试删除集NULL