有什么方法可以让一个 table 中的 INSERT 始终也插入 SQL 中的另一个 table?
Is there some way to have an INSERT into one table always also INSERT into another table in SQL?
我有两个 table 是相互关联的。为简单起见,我们将它们定义为 products 和 productVariants:
CREATE TABLE products (
id STRING(64) NOT NULL,
name STRING(64) NOT NULL,
price FLOAT64 NOT NULL,
) PRIMARY KEY(id);
CREATE TABLE productVariants (
variantId INT64 NOT NULL,
name STRING(64) NOT NULL,
parentProductId STRING(64) NOT NULL,
childProductId STRING(64) NOT NULL,
FOREIGN KEY(parentProductId, childProductId) REFERENCES products (id, id)
) PRIMARY KEY(variantId);
我想要这样的功能,即每当在 productVariants 中插入一行时,都会在 products 中插入一个新行 [=41] =]id 等于 productVariants.
中的 childProductId 字段
例如,假设我的 products table 中有一行如下:
id
name
price
1
Shirt
19.99
如果我将行插入 productVariants 为:
variantId
name
parentProductId
childProductId
1
Red
1
1_1
2
Blue
1
1_2
(这里,childProductId自动生成为parentProductId_variantId)
我想插入新产品,留下 产品 table 看起来像:
id
name
price
1
Shirt
19.99
1_1
Shirt (Red)
19.99
1_2
Shirt (Blue)
19.99
在创建 table 时,我可以添加某种约束以强制执行此功能吗?或者这是否只能通过在我的应用程序代码中实现才能实现?
如有任何见解,我们将不胜感激。提前致谢!
附加信息:我正在使用 Google Cloud Spanner。
PK/FK 约束旨在防止孤立的子 table 数据无助于填充父 table 数据。相反,当向父级添加新行时,它不知道应该将哪些数据放入子级 table,因此在父级 table 上发生插入时甚至没有什么可检查的。
这种类型的逻辑通常在应用程序层处理,让用户在如何填充子 table(s) 方面具有一定的灵活性。例如。一个事务中的所有 inserted/updated(可扩展性问题的风险)、不同子行的不同值、父子行之间的故意延迟 tables 以允许对可能影响子行的父数据进行额外验证或扩充等...
在更简单的场景中,有时会使用触发器来实现。触发器将具有决定为父项上的每个 INSERT 或 UPDATE 填充子项 table 所需的任何逻辑。非常适合简单的逻辑和低 INSERT/UPDATE 率。如果您的触发器很复杂 and/or 并且您已经维持了高音量 INSERT/UPDATE,则可能会成为系统上的可测量负载。也就是说,Cloud Spanner 目前不支持触发器。
我有两个 table 是相互关联的。为简单起见,我们将它们定义为 products 和 productVariants:
CREATE TABLE products (
id STRING(64) NOT NULL,
name STRING(64) NOT NULL,
price FLOAT64 NOT NULL,
) PRIMARY KEY(id);
CREATE TABLE productVariants (
variantId INT64 NOT NULL,
name STRING(64) NOT NULL,
parentProductId STRING(64) NOT NULL,
childProductId STRING(64) NOT NULL,
FOREIGN KEY(parentProductId, childProductId) REFERENCES products (id, id)
) PRIMARY KEY(variantId);
我想要这样的功能,即每当在 productVariants 中插入一行时,都会在 products 中插入一个新行 [=41] =]id 等于 productVariants.
中的 childProductId 字段例如,假设我的 products table 中有一行如下:
id | name | price |
---|---|---|
1 | Shirt | 19.99 |
如果我将行插入 productVariants 为:
variantId | name | parentProductId | childProductId |
---|---|---|---|
1 | Red | 1 | 1_1 |
2 | Blue | 1 | 1_2 |
(这里,childProductId自动生成为parentProductId_variantId)
我想插入新产品,留下 产品 table 看起来像:
id | name | price |
---|---|---|
1 | Shirt | 19.99 |
1_1 | Shirt (Red) | 19.99 |
1_2 | Shirt (Blue) | 19.99 |
在创建 table 时,我可以添加某种约束以强制执行此功能吗?或者这是否只能通过在我的应用程序代码中实现才能实现?
如有任何见解,我们将不胜感激。提前致谢!
附加信息:我正在使用 Google Cloud Spanner。
PK/FK 约束旨在防止孤立的子 table 数据无助于填充父 table 数据。相反,当向父级添加新行时,它不知道应该将哪些数据放入子级 table,因此在父级 table 上发生插入时甚至没有什么可检查的。
这种类型的逻辑通常在应用程序层处理,让用户在如何填充子 table(s) 方面具有一定的灵活性。例如。一个事务中的所有 inserted/updated(可扩展性问题的风险)、不同子行的不同值、父子行之间的故意延迟 tables 以允许对可能影响子行的父数据进行额外验证或扩充等...
在更简单的场景中,有时会使用触发器来实现。触发器将具有决定为父项上的每个 INSERT 或 UPDATE 填充子项 table 所需的任何逻辑。非常适合简单的逻辑和低 INSERT/UPDATE 率。如果您的触发器很复杂 and/or 并且您已经维持了高音量 INSERT/UPDATE,则可能会成为系统上的可测量负载。也就是说,Cloud Spanner 目前不支持触发器。