SQL 如何把两个表相关联的数据一同删除
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 如何把两个表相关联的数据一同删除相关的知识,希望对你有一定的参考价值。
a为主表,b为子表 子表与主表的ID关联
删除了主表的数据,子表的数据没有删除
如何把两个表相关联的数据一同删除
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'
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
列。见:
但是,该列似乎是使用
bigint
类型创建的。怎么做 我让 Grails 使用bigserial
数据类型创建列,并将 这甚至解决了我的问题?
这是预期的行为。将列定义为bigserial
,仅此而已您必须做。 Postgres 伪 数据类型smallserial
, serial
and bigserial
分别创建smallint
、int
或bigint
列,并附加专用序列。手册:
数据类型
smallserial
、serial
和bigserial
不是真正的类型, 但仅仅是创建唯一标识符的符号便利 列(类似于某些支持的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语句从主表删除一条数据,并且把先关联的多个子表数据也删除