我有一个返回一些 ora-01427 错误的 SQL 请求:
单行子查询返回多行
INSERT INTO my_table (value0, value1, value2, value3)
VALUES((SELECT MAX(value0) FROM my_table), '5', (SELECT DISTINCT(value2) FROM another_table), '8');
Run Code Online (Sandbox Code Playgroud)
问题是,我需要两个硬编码值,我需要来自仅返回一行的选择的值,并且我想对第二个选择返回的每一行执行此操作。
我觉得如果只有一个选择,这个查询就会起作用。有没有办法在 INSERT 中执行多个 SELECT ?语法是什么?
编辑: my_table 和 some_table 实际上是同一个表,很抱歉一开始就不清楚,实际上,我需要 value0 是唯一的,因此它需要每次都检索最大的 id,不仅仅是在插入之前,而是每次新插入时行已插入。
我使用 Liquibase 插入将两行添加到数据库并通过外键链接它们,如下所示:
<changeSet id="1.0.1" author="x">
<insert tableName="TABLE1">
<column name="NAME" value="a value"/>
</insert>
</changeSet>
<changeSet id="1.0.2" author="x">
<insert tableName="TABLE2">
<column name="FK" valueComputed="(SELECT ID FROM TABLE1 WHERE NAME = 'a value')"/>
</insert>
</changeSet>
Run Code Online (Sandbox Code Playgroud)
除了 TABLE2 中外键的值之外,两条记录均已正确插入。该值保持为空。所以看来“computeValue”属性没有正确执行,但我不明白为什么。我希望在 Liquibase 中找到一个解决方案,而不是在普通 SQL 中,因为 Liquibase 为我提供了轻松插入 clob 字段的可能性。
表1:ID - 5522839049923041049862979858500642751,名称 - 一个值
表2:ID - 4246034635279239656888789950125407204,FK -(空)
这是表结构:
<changeSet id="1.0.0" author="x">
<createTable tableName="TABLE1">
<column name="ID" type="NUMBER (38)">
<constraints primaryKey="true"/>
</column>
<column name="NAME" type="NUMBER (38)">
<constraints nullable="false"/>
</column>
</createTable>
<addUniqueConstraint columnNames="NAME"
constraintName="TABLE1_UK1"
tableName="TABLE1"/>
<createTable tableName="TABLE2">
<column …Run Code Online (Sandbox Code Playgroud) 我有两个表 A(id, col1, col2) 和 B(col3, col4, col5, col6)
表 A 中的列“id”是自动生成的主键,而不是 null。
要将数据从表 B 插入表 A,我正在尝试
INSERT INTO A(col1, col2)
(SELECT col3, col4 from B)
Run Code Online (Sandbox Code Playgroud)
此语句引发错误
ERROR: null value in column "id" violates not-null constraint
DETAIL: Failing row contains (null, "abc", "def")
Run Code Online (Sandbox Code Playgroud)
我也试过
INSERT INTO A(id, col1, col2)
(SELECT DEFAULT, col3, col4 from B)
Run Code Online (Sandbox Code Playgroud)
这会引发错误
ERROR: syntax error at or near "DEFAULT"
Run Code Online (Sandbox Code Playgroud)
为什么 postgres 不为列“id”自动生成值?如果我从表 B 中提供“id”,或者如果我插入单行(没有选择)并为自动生成的列提供“DEFAULT”关键字,则查询有效。
编辑:表创建查询
CREATE TABLE A
(
id bigint NOT NULL,
col1 character varying(10), …Run Code Online (Sandbox Code Playgroud) 我编写了一个 Node.js 应用程序,它将大量记录写入 PostgreSQL 9.6 数据库。不幸的是,感觉很慢。为了能够进行测试,我创建了一个简短但完整的程序来重现该场景:
'use strict';
const async = require('async'),
pg = require('pg'),
uuid = require('uuidv4');
const pool = new pg.Pool({
protocol: 'pg',
user: 'golo',
host: 'localhost',
port: 5432,
database: 'golo'
});
const records = [];
for (let i = 0; i < 10000; i++) {
records.push({ id: uuid(), revision: i, data: { foo: 'bar', bar: 'baz' }, flag: true });
}
pool.connect((err, database, close) => {
if (err) {
/* eslint-disable no-console */
return console.log(err); …Run Code Online (Sandbox Code Playgroud) 我有一个字段(称为 ID),定义为:
smallint(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=32768
Run Code Online (Sandbox Code Playgroud)
我有一个查询如下(简化):
INSERT INTO delivery (`ConsigneeName`, `ConsigneePhone`) VALUES ('John Doe', '9999999999')
Run Code Online (Sandbox Code Playgroud)
并且也尝试过
INSERT INTO delivery (`ID`, `ConsigneeName`, `ConsigneePhone`) VALUES (NULL, 'John Doe', '9999999999')
Run Code Online (Sandbox Code Playgroud)
但是,我不断收到错误消息:
#167 - Out of range value for column 'ID' at row 1
Run Code Online (Sandbox Code Playgroud)
那么可能是什么问题呢?我不知所措 - 尝试在字段名称和值上使用 ' 和 ` 只是为了看看这是否是问题所在,但我得到了相同的结果。我什至尝试使用 phpmyadmin 界面插入值(并将 ID 留空),但我得到了同样的错误。
提前感谢您的帮助。
我有一个查询将多个数据作为单个查询一次性插入。
INSERT INTO tableName (COLUMN_1, COLUMN_2, COLUMN_3)
SELECT 'test1', 'test2', 'test3'
UNION ALL
SELECT 'test4', 'test5', 'test6'
UNION ALL
SELECT 'test7', 'test8', 'test8'
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,有没有办法实现“ON DUPLICATE KEY UPDATE”?就像是:
INSERT INTO tableName (COLUMN_1, COLUMN_2, COLUMN_3)
SELECT 'test1', 'test2', 'test3'
ON DUPLICATE KEY UPDATE COLUMN_1='new', COLUMN_2='new', COLUMN_3='new'
UNION ALL
SELECT 'test1', 'test2', 'test3'
ON DUPLICATE KEY UPDATE COLUMN_1='new', COLUMN_2='new', COLUMN_3='new'
UNION ALL
SELECT 'test1', 'test2', 'test3'
ON DUPLICATE KEY UPDATE COLUMN_1='new', COLUMN_2='new', COLUMN_3='new';
Run Code Online (Sandbox Code Playgroud)
注意:可能是无关紧要或毫无意义的,但我正在使用 mysql 工作台执行此操作。
SQLite 新手,尝试了解 upsert 功能。
我有一个包含以下 DDL 的表:
CREATE TABLE contacts (
contact_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
phone TEXT NOT NULL UNIQUE
);
Run Code Online (Sandbox Code Playgroud)
假设我插入一条记录:
INSERT INTO contacts (contact_id, first_name, last_name, email, phone)
VALUES (1, 'John', 'Jones', 'jjones@gmail.com', '888-867-5309');
Run Code Online (Sandbox Code Playgroud)
我怎样才能做一个同时考虑 UNIQUE 约束 ( email) 和 PK 约束 ( contact_id) 的更新插入,以便它处理这两种情况,因为我不知道哪个约束会失败。
我尝试这样做:
INSERT INTO contacts (contact_id, first_name, last_name, email, phone)
VALUES (1, 'John', 'Jones', 'john.jones@gmail.com', '888-867-5309')
ON CONFLICT (contact_id, …Run Code Online (Sandbox Code Playgroud) 我有一个这样的表:
\n\nCREATE TABLE schema.mytable\n(\n id serial NOT NULL,\n number integer NOT NULL,\n state boolean NOT NULL,\n);\nRun Code Online (Sandbox Code Playgroud)\n\n我需要创建一组唯一的 \xc2\xb4number\xc2\xb4 但是,状态列必须为 true;如果状态列为假,则数字可以重复,这是我需要有效的示例:
\n\nid number state\n1 123 true\n2 124 true\n3 125 true\n4 123 false\n5 129 false\nRun Code Online (Sandbox Code Playgroud)\n\n如您所见,数字 123 被重复,但在一种情况下状态为 false,另一种情况为 true;这是不正确的:
\n\nid number state\n1 123 true\n2 124 true\n3 125 true\n4 123 true (*incorrect)\n5 129 false\nRun Code Online (Sandbox Code Playgroud)\n\n另外,123也有可能以错误状态重复两次或更多次;我怎样才能实现这个目标?
\n我正在从 UUID 获取用户数据WHERE empl_user_pub_uuid = 'e2bb39f1f28011eab66c63cb4d9c7a34'。
由于我不想进行额外的查询来获取额外的用户数据,所以我试图通过INSERT.
WITH _u AS (
SELECT
eu.empl_user_pvt_uuid,
ee.email,
ep.name_first
FROM employees.users eu
LEFT JOIN (
SELECT DISTINCT ON (ee.empl_user_pvt_uuid)
ee.empl_user_pvt_uuid,
ee.email
FROM employees.emails ee
ORDER BY ee.empl_user_pvt_uuid, ee.t DESC
) ee ON eu.empl_user_pvt_uuid = ee.empl_user_pvt_uuid
LEFT JOIN (
SELECT DISTINCT ON (ep.empl_user_pvt_uuid)
ep.empl_user_pvt_uuid,
ep.name_first
FROM employees.profiles ep
) ep ON eu.empl_user_pvt_uuid = ep.empl_user_pvt_uuid
WHERE empl_user_pub_uuid = 'e2bb39f1f28011eab66c63cb4d9c7a34'
)
INSERT INTO employees.password_resets (empl_pwd_reset_uuid, empl_user_pvt_uuid, t_valid, for_empl_user_pvt_uuid, token)
SELECT 'f70a0346-a077-11eb-bd1a-aaaaaaaaaaaa', '6efc2b7a-f27e-11ea-b66c-de1c405de048', '2021-04-18 …Run Code Online (Sandbox Code Playgroud) sql postgresql greatest-n-per-group sql-insert sql-returning
我正在尝试做的事情:
我正在尝试将大约 200 万条记录从一个表移动到另一个表中。为此,我正在执行一个insert由查询提供的语句select。
insert into my_table (
select a, b, c
from my_other_table
where (condition)
)
Run Code Online (Sandbox Code Playgroud)
然而,在运行这个程序时,我总是出现内存不足的情况。
我的期望(以及为什么我感到困惑):
如果工作集大于内存所能容纳的大小,我完全认为 Postgres 会将页面缓冲到磁盘上并在幕后迭代地进行写入。
然而,所发生的情况是,它显然尝试将所有edselect内容读入内存,然后再将其填充到另一个表中。
即使在我们的大块 r5.2xl 实例上,它也会消耗所有内存,直到最终 OOM Killer 触发并且 Aurora 重新启动实例。
该图显示每次运行查询时,可用内存都会下降到零。内存备份是由于实例因 OOM 而被自动杀死并重新启动。
我的主要问题:
我尝试过的:
调整shared_buffers和work_mem参数。
Aurora 的默认shared_buffer值为我们的实例分配 20GB。我尝试将其调低至 10gb,然后调至 6.5gb(每次都重新启动),但无济于事。唯一的影响是使查询花费很长时间,并且在运行大约 30 分钟后最终仍然消耗所有可用内存。
我同样尝试将work_mem所有方式设置为允许的最小值,但这似乎对最终结果没有影响。
我可以做些什么来解决这个问题:
当然,我可以从客户端进行分页/批处理:
computeBatchOffsets(context).forEach(batchOffset ->
context.insertInto(BLAH)
.select(DSL.asterisk())
.from(FOO)
.limit(batchOffset)
.offset(batchOffset)
.execute()
Run Code Online (Sandbox Code Playgroud)
但是,除了比仅仅让数据库执行它要慢之外,它“感觉”像是数据库肯定能够在 …
sql-insert ×10
sql ×6
postgresql ×5
mysql ×2
amazon-rds ×1
javascript ×1
jooq ×1
liquibase ×1
node.js ×1
oracle ×1
performance ×1
sqlite ×1