【发布时间】:2018-08-28 07:26:01
【问题描述】:
我有两张桌子; ItemTable 和 ProductTable。 ProductTable 的 ItemID 列链接到 ItemTable 的 ID 列。两个表的ID 列是主键和标识列。
像这样:
ItemTable:
ID Col ColOther Latest Time
100 'old' 'oldother' 1 <Autogenerated timestamp>
ProductTable:
ID ItemID Value ValueOther Latest Time
12 100 'foo' 'bar' 1 <Autogenerated timestamp>
每当我想手动UPDATE在ItemTable 中添加一行时,通常只需一个查询即可完成:
query = \
"""
UPDATE ItemTable
SET Col = ?, ColOther = ?
WHERE ID = 100;
"""
cursor.execute(query, 'new', 'newother')
我不想像上面那样只做UPDATE,而是想为ItemTable做这些事情:
-
自动
UPDATE旧行有Latest = 0 -
INSERT具有更新值的行,Latest = 1(假设此行获取ID250)
那么对于ProductTable:
-
自动
UPDATEProductTable 中的旧链接行具有Latest = 0 - 并且自动
INSERT与新的ItemID和Latest = 1在同一行
这种自动的INSERT 和UPDATE 最好只使用纯SQL 查询(可能使用OUTPUT,但我不熟悉),或者它可以用一些Python 代码实现。我该怎么做呢?
想要的最终结果:
ItemTable:
ID Col ColOther Latest Time
100 'old' 'oldother' 0 <Autogenerated timestamp>
250 'new' 'newother' 1 <Autogenerated timestamp>
ProductTable:
ID ItemID Value ValueOther Latest Time
12 100 'foo' 'bar' 0 <Autogenerated timestamp>
110 250 'foo' 'bar' 1 <Autogenerated timestamp>
【问题讨论】:
-
您可以在插入时为此编写触发器
-
output clause 会很有用。
-
您能否按 ID 定位行?在这种情况下,您只需执行
UPDATE table SET Latest=0 WHERE ID=12和INSERT table SET ItemID=250, Value='foo', ValueOther='bar', Latest=1。这也假设列 ID 是自动递增的。如果您有另一种语言来补充 SQL,那么提供它也会非常有帮助。 -
如果 ProductTable 只包含有关一种产品的信息,我可以按照您的逻辑进行操作,否则我看不到如何确定应该复制哪个 ProductTable 行。请edit你的问题充实你的例子。
-
@GordThompson 我已经对我的问题进行了相当多的编辑,现在应该更清楚了。请检查一下:)
标签: python sql sql-server tsql pyodbc