SQL 如何把两个表相关联的数据一同删除

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 如何把两个表相关联的数据一同删除相关的知识,希望对你有一定的参考价值。

a为主表,b为子表 子表与主表的ID关联
删除了主表的数据,子表的数据没有删除
如何把两个表相关联的数据一同删除

其实你这个问题最好用数据库本身的外键解决。就是在子表建立指向父表的外键。当删除主表数据时,只要加上delete语句加上 on cascade,所有子表引用的数据就删除了。 参考技术A 删除主-从表的记录可以建立简单存储过程来实现:
CREATE PROCEDURE [存储过程]
(
@Id VARCHAR(50)
)
AS
DELETE [子表] WHERE [关联Id] = @Id
DELETE [主表] WHERE [Id] = @Id
GO

执行方法:EXECUTE [存储过程] @Id追问

存储过程是无效的

追答

怎么会呢?具体信息如何?我刚测试过了,是可以的,其中A表为主表,B表为子表,B表中的A_Id对应A表中的ID,代码如下:
CREATE PROCEDURE [Test_Pro] (@Id VARCHAR(50))
AS
DELETE [A] WHERE [Id] = @Id
DELETE [B] WHERE [A_Id] = @Id
GO
例如要删除A表B表中Id为100000的记录,执行:EXECUTE [Test_Pro] '100000'

本回答被提问者采纳
参考技术B 楼上还有一种方式的。把子表的和主表关联的ID设为外键,再查看外键和主健的关系,在里面的INSERT和UPDATE规范选项里的删除规则设置为层叠,这样删除主表里的数据子数的数据也会跟着删除 参考技术C 已经删除了主表的数据,那就再写一条删字表的sql:
delete from 子表 where 子表.id not in (select id from 主表);
参考技术D delete from b where id in
(select id from a where id in (*,*,*))
delect from a where id in (*,*,*)
ID必需相同

如何正确地将 id 生成器序列与表相关联

【中文标题】如何正确地将 id 生成器序列与表相关联【英文标题】:How to correctly associate an id generator sequence with a table 【发布时间】:2015-10-07 01:29:00 【问题描述】:

我正在使用 Grails 3.0.7 和 Postgres 9.2。我对 Postgres 很陌生,所以这可能是一个愚蠢的问题。?我在某处读到,如果您创建一个具有 serial 数据类型的 id 列的表,那么它将自动为该表创建一个序列。

但是,该列似乎是使用bigint 类型创建的。如何让 Grails 创建具有 bigserial 数据类型的列,这甚至可以解决我的问题吗?如果我想要每张桌子一个序列怎么办?我只是不确定如何设置它,因为我过去从未真正使用过 Postgres。

【问题讨论】:

这可能会有所帮助:***.com/questions/7580807/… 我已经做到了。我可以毫无问题地生成序列。问题似乎是 grails 在创建表时将 bigint 数据类型与列相关联,而不是与 bigserial 相关联,因此无法正确使用序列。 【参考方案1】:

您可以像这样在域类中定义生成器:

static mapping = 
    id generator:'sequence', params:[sequence:'domain_sq']

如果该序列已经存在于数据库中,那么您需要将其命名为 params

documentation 中列出的其他属性也可用,例如:

static mapping = 
 id column: 'book_id', type: 'integer'

【讨论】:

【参考方案2】:

Postgres 10 或更高版本中,请考虑使用 IDENTITY 列。见:

Auto increment table column

但是,该列似乎是使用bigint 类型创建的。怎么做 我让 Grails 使用 bigserial 数据类型创建列,并将 这甚至解决了我的问题?

这是预期的行为。将列定义为bigserial仅此而已您必须做。 Postgres 数据类型smallserial, serial and bigserial 分别创建smallintintbigint 列,并附加专用序列。手册:

数据类型smallserialserialbigserial不是真正的类型, 但仅仅是创建唯一标识符的符号便利 列(类似于某些支持的 AUTO_INCREMENT 属性 其他数据库)。在当前实现中,指定:

CREATE TABLE tablename (
    colname SERIAL
);

相当于指定:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

大报价,我无法比手册更好地描述它。

相关:

Get table and column "owning" a sequence Safely rename tables using serial primary key columns

【讨论】:

嗯,好的,那么我的 Grails 项目设置可能有问题,因为 id 列最终没有拥有相应的序列。我想这可能只是与 Postgres 相关的东西,因为我对 Postgres 的经验接近 0。

以上是关于SQL 如何把两个表相关联的数据一同删除的主要内容,如果未能解决你的问题,请参考以下文章

sql语句从主表删除一条数据,并且把先关联的多个子表数据也删除

sql如何将一个表与另外一张表相关联

如何通过java程序查询出来与数据库中指定的表相关联的表呢?

SQL怎样合并显示两个没有关联的表

如何正确地将 id 生成器序列与表相关联

在SQL中怎么删除两个表中相同的数据