我有一张桌子items (item_id serial, name varchar(10), item_group int)
和一张桌子items_ver (id serial, item_id int, name varchar(10), item_group int)
。
现在我想在items_ver
from 中插入一行items
。是否有任何简短的 SQL 语法来执行此操作?
我试过:
INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item_id = 2);
Run Code Online (Sandbox Code Playgroud)
但我收到一个语法错误:
ERROR: syntax error at or near "select"
LINE 1: INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item...
Run Code Online (Sandbox Code Playgroud)
我现在尝试:
INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;
Run Code Online (Sandbox Code Playgroud)
它工作得更好,但我遇到了一个错误:
ERROR: column "item_group" is of type integer …
Run Code Online (Sandbox Code Playgroud) 使用 PostgreSQL v9.1。我有以下表格:
CREATE TABLE foo
(
id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY,
type VARCHAR(60) NOT NULL UNIQUE
);
CREATE TABLE bar
(
id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY,
description VARCHAR(40) NOT NULL UNIQUE,
foo_id BIGINT NOT NULL REFERENCES foo ON DELETE RESTRICT
);
Run Code Online (Sandbox Code Playgroud)
假设第一个表foo
是这样填充的:
INSERT INTO foo (type) VALUES
( 'red' ),
( 'green' ),
( 'blue' );
Run Code Online (Sandbox Code Playgroud)
有没有办法bar
通过引用foo
表轻松插入行?或者我必须分两步完成,首先查找foo
我想要的类型,然后在其中插入一个新行bar
?
这是一个伪代码示例,显示了我希望可以完成的工作:
INSERT INTO bar (description, foo_id) VALUES
( …
Run Code Online (Sandbox Code Playgroud) 此问题与使用 PostgreSQL 9.2 或更高版本忽略重复插入有关。我问的原因是因为这段代码:
-- Ignores duplicates.
INSERT INTO
db_table (tbl_column_1, tbl_column_2)
VALUES (
SELECT
unnseted_column,
param_association
FROM
unnest( param_array_ids ) AS unnested_column
);
Run Code Online (Sandbox Code Playgroud)
代码不受检查现有值的影响。(在这种特殊情况下,用户并不关心插入重复项的错误——插入应该“正常工作”。)在这种情况下添加代码来显式测试重复项会带来复杂性。
在 PostgreSQL 中,我找到了几种忽略重复插入的方法。
创建一个捕获唯一约束违规的事务,不采取任何行动:
BEGIN
INSERT INTO db_table (tbl_column) VALUES (v_tbl_column);
EXCEPTION WHEN unique_violation THEN
-- Ignore duplicate inserts.
END;
Run Code Online (Sandbox Code Playgroud)
创建规则以忽略给定表上的重复项:
CREATE OR REPLACE RULE db_table_ignore_duplicate_inserts AS
ON INSERT TO db_table
WHERE (EXISTS ( SELECT 1
FROM db_table
WHERE db_table.tbl_column = NEW.tbl_column)) DO INSTEAD NOTHING;
Run Code Online (Sandbox Code Playgroud)
我的问题主要是学术性的:
假设我必须将数据从一台服务器导出到另一台服务器(通过链接服务器)。哪个语句会更有效率?
在源服务器中执行:
INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table]
SELECT a, b, c, ... FROM [dbo].Udf_GetExportData()
Run Code Online (Sandbox Code Playgroud)
或者在目标服务器中执行:
INSERT INTO [dbo].[Table]
SELECT a, b, c, ...
FROM OPENQUERY([OriginLinkedServer],
'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()')
Run Code Online (Sandbox Code Playgroud)
哪一个会更快并且总共消耗更少的资源(源服务器和目标服务器)?两台服务器都是 SQL Server 2005。
我有一个 SQL 语句,该语句将行插入到表中,并且在 TRACKING_NUMBER 列上具有聚集索引。
例如:
INSERT INTO TABL_NAME (TRACKING_NUMBER, COLB, COLC)
SELECT TRACKING_NUMBER, COL_B, COL_C
FROM STAGING_TABLE
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 在聚集索引列的 SELECT 语句中使用 ORDER BY 子句是否有帮助,或者是否会因 ORDER BY 子句所需的额外排序而否定任何获得的收益?
我知道 SQL 表上的 INSERT 可能由于多种原因而变慢:
在我的特定情况下,我如何判断哪个负责?如何衡量页面拆分与非聚集索引更新与其他所有内容的影响?
我有一个存储过程,一次插入大约 10,000 行(来自临时表),每 10k 行大约需要 90 秒。这是令人无法接受的缓慢,因为它会导致其他 spid 超时。
我查看了执行计划,我看到了 INSERT CLUSTERED INDEX 任务和 FK 查找中的所有 INDEX SEEKS,但它仍然没有确切地告诉我为什么需要这么长时间。没有触发器,但该表确实有一些 FKey(似乎已正确索引)。
这是一个 SQL 2000 数据库。
我有一个数据库,我将文件加载到临时表中,从这个临时表我有 1-2 个连接来解析一些外键,然后将这些行插入到最终表中(每个月有一个分区)。我有大约 34 亿行数据,用于三个月的数据。
将这些行暂存到最终表中的最快方法是什么?SSIS 数据流任务(使用视图作为源并具有快速加载活动)或插入 INTO SELECT .... 命令?我尝试了数据流任务,可以在大约 5 小时内获得大约 10 亿行(服务器上有 8 个内核/192 GB RAM),这对我来说感觉很慢。
performance sql-server insert sql-server-2012 query-performance
例如,当我使用返回记录 ID 的查询时
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
Run Code Online (Sandbox Code Playgroud)
产生输出:
1
2
3
Run Code Online (Sandbox Code Playgroud)
这个 ids 会指向相应的插入值吗?
1 -> name1
2 -> name2
3 -> name3
Run Code Online (Sandbox Code Playgroud) 我的 SQL Server 数据库中有一个配置表,该表应该只有一行。为了帮助未来的开发人员理解这一点,我想防止添加多于一行的数据。我选择为此使用触发器,如下所示......
ALTER TRIGGER OnlyOneConfigRow
ON [dbo].[Configuration]
INSTEAD OF INSERT
AS
BEGIN
DECLARE @HasZeroRows BIT;
SELECT @HasZeroRows = CASE
WHEN COUNT (Id) = 0 THEN 1
ELSE 0
END
FROM
[dbo].[Configuration];
IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0
BEGIN
RAISERROR ('You should not add more than one row into the config table. ', 16, 1)
END
END
Run Code Online (Sandbox Code Playgroud)
这不会引发错误,但不允许第一行进入。
还有比这更有效/更自我解释的方法可以将可以插入表中的行数限制为 1 吗?我是否缺少任何内置的 SQL Server 功能?
我正在编写批处理插入语句,并希望使用临时表来跟踪插入的 ID,而不是自己循环遍历项目并为每个插入的行调用 SCOPE_IDENTITY()。
需要插入的数据具有(临时)ID 将其链接到也应该插入到另一个表中的其他数据,因此我需要实际 Id 和临时 Id 的交叉引用。
这是我到目前为止所拥有的一个例子:
-- The existing table
DECLARE @MyTable TABLE (ID INT IDENTITY(1,1), [Name] NVARCHAR(MAX));
-- My data I want to insert
DECLARE @MyInsertData TABLE (ID INT, [Name] NVARCHAR(MAX));
INSERT INTO @MyInsertData ( ID,Name)
VALUES ( -1 , 'bla'),(-2,'test'),(-3,'last');
DECLARE @MyCrossRef TABLE ([NewId] INT, OldId INT);
INSERT INTO @MyTable ( [Name] )
OUTPUT Inserted.ID, INS.ID INTO @MyCrossRef
SELECT [NAME] FROM @MyInsertData INS
-- Check the result
SELECT * FROM @MyCrossRef
Run Code Online (Sandbox Code Playgroud)
问题是我无法让 OUTPUT INTO …
insert ×10
sql-server ×5
postgresql ×4
performance ×2
constraint ×1
duplication ×1
foreign-key ×1
limits ×1
order-by ×1
row ×1
trigger ×1