【发布时间】:2021-10-18 15:30:30
【问题描述】:
我创建了一组三个表,类似于在此答案 How to store a list in a db column 中创建的表,不同之处在于我的每个键都由一对列而不是单列组成。
富:
| Chr1 | Chr2 |
|---|---|
| a | a |
| a | b |
| b | a |
| b | b |
水果:
| Type | Name |
|---|---|
| Berry | Cranberry |
| Berry | Blueberry |
| Aggregate | Blackberry |
| Berry | Blackberry |
| Berry | Lingonberry |
| Aggregate | Raspberry |
| Berry | Raspberry |
| Berry | Boysenberry |
FooFruits:
| Chr1 | Chr2 | Type | Name |
|---|
Foo 将是 ~75 行
Fruits 大约为 600 行,并且还有其他未在此处使用的列。
最终 FooFruits 会很长,因为我将为每个 Foo 分配一个大的水果列表。
所有这些列都是 nvarchar(50)。
我制作复合键是因为保证每个 [Chr1] 和 [Chr2] 或每个 [Type] 和 [Name] 都有重复项,但不能有重复项。
我可以使用 mmxx 提供的格式(根据我的目的以不同的顺序)
INSERT FooFruits([Chr1], [Chr2], [Type], [Name])
SELECT [Chr1],[Chr2],'berry','cranberry' FROM Foo WHERE [Chr1] ='a' and [Chr2]='b'
在我的“FooFruits”表中创建一个新行。
将使用 Python 程序访问和修改这些数据库,很可能使用 PyQt5 中的 QSqlTableModels。
实际问题
是否有某种方法可以为[Name] = '%nberry' 的所有内容插入一行,以便为“蔓越莓”、“越橘”和“博森莓”插入行?我可以SELECT [Name] FROM Fruits WHERE [Name] = '%nberry' 然后循环遍历每个结果并为它们运行单独的插入,但这似乎非常低效。
我还想知道如果我删除“Foo”或“Fruits”中的某一行,“FooFruits”中的相应行会发生什么情况。
【问题讨论】:
-
您使用的是什么数据库?你是如何将这些表连接在一起的?您可以将
LIKE用于您所引用的内容。此外,由于 FooFruits 是表而不是视图,除非您在其上放置外键,否则如果您从 Foo 或 Fruits 中删除行,则不会发生任何事情。 -
我使用的是 Microsoft SQL Server,并且我有连接表的外键,因此无法将任何不是正确的 Fruit 或 Foo 的内容添加到 FooFruits。
-
更新:我重新格式化了我的查询,它能够与
Like一起工作,我之前尝试过但没有成功。可能还犯了其他错误。谢谢你让我再试一次。
标签: sql sql-server select insert key