想象一下,我有一个带有柱子的桌子(冰箱):(日期(pk),水果,蔬菜,淀粉,糖果).这是一个示例行:
date | fruits | veggies | starches | sweets
20180220 | melon | potato | pasta | fudge
Run Code Online (Sandbox Code Playgroud)
我想在冰箱中插入或替换以下列中的某些列:
> INSERT or REPLACE into refrigerator (date, fruits, veggies, starches) VALUES ("20180220", "apple", "carrot", "bread")
Run Code Online (Sandbox Code Playgroud)
当我这样做时,如果我没有为(糖果)指定一个值,它将被NULL覆盖.
date | fruits | veggies | starches | sweets
20180220 | apple | carrot | bread | NULL
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么,不能取代我指定的值?
我确信这显然是显而易见的.随意嘲笑我.
现在它按预期工作,如果不存在,也会插入行.没有UNION ALL,它将无法正常工作.第一个SELECT使用COALESCE()在存在行的情况下保留现有列值.带有NOT EXISTS的第二个SELECT涵盖了行不存在的情况,因此它构造了一个.因此,UNION ALL只返回1行:现有行中的"合并"行或全新行.然后,REPLACE INTO通过主键将此合并/创建的行替换回表中.
CREATE TABLE refrigerator
(
date TEXT(8) NOT NULL PRIMARY KEY
, fruits TEXT(50) NULL
, veggies TEXT(50) NULL
, starches TEXT(50) NULL
, sweets TEXT(50) NULL
);
INSERT INTO refrigerator (date, fruits, veggies, starches, sweets)
VALUES ("20180220", "melon", "potato", "pasta", "fudge");
REPLACE INTO refrigerator (date, fruits, veggies, starches, sweets)
SELECT
date
, COALESCE("apple", fruits) as fruits
, COALESCE("carrot", veggies) as veggies
, COALESCE("bread", starches) as starches
, COALESCE(NULL, sweets) as sweets
FROM
refrigerator
WHERE
date = "20180220"
UNION ALL
SELECT
T.date, T.fruits, T.veggies, T.starches, T.sweets
FROM
(
SELECT
"20180220" as date
, "apple" as fruits
, "carrot" as veggies
, "bread" as starches
, NULL as sweets
) AS T
WHERE
NOT EXISTS (SELECT * FROM refrigerator AS R WHERE R.date = T.date);
SELECT date, fruits, veggies, starches, sweets FROM refrigerator;
Run Code Online (Sandbox Code Playgroud)
这是一个SQL小提琴:冰箱SQL小提琴
我用两行解决了这个问题。
UPDATE refrigerator SET fruits='apple', veggies='carrot', starches='bread' WHERE date='20180220';
Run Code Online (Sandbox Code Playgroud)
然后
INSERT or IGNORE INTO refrigerator (fruits, veggies, starches) VALUES ("apple", "carrot", "bread");
Run Code Online (Sandbox Code Playgroud)
我正在向后考虑事情,这可能会使这里的答案过于复杂。如果存在带有(日期)的行,我首先更新特定列。如果不存在,下一行将插入一个包含所需信息的新行 - 如果存在则忽略它。
这样做是否会出现任何并发症?我已经对其进行了测试,到目前为止一切都按预期工作。
| 归档时间: |
|
| 查看次数: |
1253 次 |
| 最近记录: |