给定一个表:
CREATE TABLE IF NOT EXISTS test."TestCounter"
("id" TEXT PRIMARY KEY,
"count" INTEGER);
Run Code Online (Sandbox Code Playgroud)
我想插入一条记录并增加计数器(如果该记录已存在)
CREATE TABLE IF NOT EXISTS test."TestCounter"
("id" TEXT PRIMARY KEY,
"count" INTEGER);
Run Code Online (Sandbox Code Playgroud)
目前我收到此错误:
ERROR: column reference "count" is ambiguous
LINE 4: SET "count" = "count" + 1
^
SQL state: 42702
Character: 107
Run Code Online (Sandbox Code Playgroud) 我有一个 Postgres 表,对多个列有唯一约束,其中一列可以为 NULL。我只希望每个组合都允许该列中的一条记录为 NULL。
create table my_table (
col1 int generated by default as identity primary key,
col2 int not null,
col3 real,
col4 int,
constraint ux_my_table_unique unique (col2, col3)
);
Run Code Online (Sandbox Code Playgroud)
我有一个 upsert 查询,当它遇到 col2、col3 中具有相同值的记录时,我想更新 col4:
insert into my_table (col2, col3, col4) values (p_col2, p_col3, p_col4)
on conflict (col2, col3) do update set col4=excluded.col4;
Run Code Online (Sandbox Code Playgroud)
但当 col3 为 NULL 时,冲突不会触发。我读过有关使用触发器的内容。请问,引发冲突的最佳解决方案是什么?
我想将 JSON 数组中的所有元素插入到表中:
INSERT INTO local_config(parameter, value)
SELECT json_extract(j.value, '$.parameter'), json_extract(j.value, '$.value')
FROM json_each(json('[{"parameter": 1, "value": "value1"}, {"parameter": 2, "value": "value2"}]')) AS j
WHERE value LIKE '%'
ON CONFLICT (parameter) DO UPDATE SET value = excluded.value;
Run Code Online (Sandbox Code Playgroud)
到目前为止这有效,但我真的需要这个WHERE value LIKE '%'条款吗?
当我删除它时:
INSERT INTO local_config(parameter, value)
SELECT json_extract(j.value, '$.parameter'), json_extract(j.value, '$.value')
FROM json_each(json('[{"parameter": 1, "value": "value1"}, {"parameter": 2, "value": "value2"}]')) AS j
ON CONFLICT (parameter) DO UPDATE SET value = excluded.value;
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
[SQLITE_ERROR] SQL error or missing database (near …Run Code Online (Sandbox Code Playgroud) 我遇到了使用Mongoose问题的问题.它说语法无效,unexpected token "."最后一行说.但我无法理解究竟是什么问题.我一直在研究它超过一个小时,我错过了一个简单的概念吗?
var seriesSchema = new Schema({
type : {type: Number, default: 1},
features: {
tvdb_id: {type: Number, unique: true},
....
},
created : {type: Date}
});
var SeriesModel = mongoose.model('Series', seriesSchema);
var instance = new SeriesModel();
// Setting instance properties to some values
SeriesModel.update({features.tvdb_id : serieData.id}, instance, {upsert: true});
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下测试代码来测试新的PostgreSQL upsert语法,但是出现语法错误:
test=> CREATE TABLE test1 (
test(> key1 integer PRIMARY KEY check (key1 > 0),
test(> key2 integer check (key2 > 0)
test(> );
CREATE TABLE
test=> CREATE OR REPLACE FUNCTION upsert(IN in_json_array jsonb)
test-> RETURNS void AS
test-> $func$
test$> UPDATE test1 t SET
test$> t.key1 = (obj->>'key1')::int,
test$> t.key2 = (obj->>'key2')::int
test$> FROM JSONB_ARRAY_ELEMENTS(in_json_array) obj
test$> WHERE t.key1 = obj->'key1'
test$> ON CONFLICT DO UPDATE SET
test$> key1 = excluded.key1,
test$> key2 = excluded.key2;
test$>
test$> …Run Code Online (Sandbox Code Playgroud) 我有一个 Postgres 表messages如下:
Column | Type | Collation | Nullable |
-----------+--------------------------+-----------+----------
id | integer | | not null |
message | jsonb | | |
date | timestamp with time zone | | not null |
Run Code Online (Sandbox Code Playgroud)
id | message | date
1 | {"name":"alpha", "pos":"x"} | 2020-02-11 12:31:44.658667+00
2 | {"name":"bravo", "pos":"y"} | 2020-02-11 12:32:43.123678+00
3 | {"name":"charlie", "pos":"z"}| 2020-02-11 12:38:37.623535+00
Run Code Online (Sandbox Code Playgroud)
我想做的是根据name键的值执行 UPSERT,即,如果存在具有相同值的插入name,则更新另一个值pos,否则创建一个新条目。
我做到了CREATE UNIQUE INDEX message_name ON messages((message->>'name'));
我在 …
我想将 Postgres 中的这段代码转换为更短的代码,以实现相同的效果。我读过有关 upsert 的内容,但我不明白在我的代码上实现它的好方法。我写的很好,但我想找到一种更优雅的方式来编写它。希望这里有人可以帮助我!这是查询:
CREATE OR REPLACE FUNCTION insert_table(
in_guid character varying,
in_x_value character varying,
in_y_value character varying
)
RETURNS TABLE(response boolean) LANGUAGE 'plpgsql'
DECLARE _id integer;
BEGIN
-- guid exists and it's been 10 minutes from created_date:
IF ((SELECT COUNT (*) FROM public.tbl_client_location WHERE guid = in_guid AND created_date < NOW() - INTERVAL '10 MINUTE') > 0) THEN
RETURN QUERY (SELECT FALSE);
-- guid exists but 10 minutes hasen't passed yet:
ELSEIF ((SELECT COUNT (*) FROM public.tbl_client_location WHERE …Run Code Online (Sandbox Code Playgroud) 我需要更新数据库中的一条记录,但我不知道该记录是否已经存在。如果存在,更新它,否则插入它。现在我想出了这个代码:
1: <?php
2: $query = "UPDATE user_meta SET active = '0' WHERE user_id = '125'";
3: $mysqli->query($query);
4:
5: if($mysqli->affected_rows == 0){
6: $query = "INSERT INTO user_meta (user_id, active) VALUES ('125', 0)";
7: $mysqli->query($query);
8: }
Run Code Online (Sandbox Code Playgroud)
桌子:
CREATE TABLE `user_meta` (
`user_id` int(11) DEFAULT NULL,
`active` tinyint(4) DEFAULT NULL,
UNIQUE KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
这段代码对我来说工作正常,但它实际上产生了一个我忽略的错误。
问题出在这一行5。受影响的行是0如果没有任何更改,即使记录已经存在。但这会触发 INSERT 语句。这个失败是因为 user_id 字段是唯一的,现在我忽略了这一点,所以我的代码工作正常。
但这是要走的路吗?或者我应该先选择然后更新或插入?
我的代码中有以下声明
INSERT INTO #TProductSales (ProductID, StockQTY, ETA1)
VALUES (@ProductID, @StockQTY, @ETA1)
Run Code Online (Sandbox Code Playgroud)
我想做的事情如下:
IF @ProductID exists THEN
UPDATE #TProductSales
ELSE
INSERT INTO #TProductSales
Run Code Online (Sandbox Code Playgroud)
有没有办法可以做到这一点?
upsert ×9
postgresql ×5
sql ×5
insert ×1
json ×1
mongodb ×1
mongoose ×1
mysql ×1
node.js ×1
null ×1
on-clause ×1
php ×1
sql-insert ×1
sql-server ×1
sql-update ×1
sqlite ×1
t-sql ×1
unique ×1