我已经看到了使用此示例进行批量插入的好方法:
WITH p AS (
INSERT INTO parent_table (column_1)
SELECT $1
RETURNING id)
INSERT INTO child_table (parent_table_id, column_a)
SELECT p.id, a
FROM p, unnest($2::text[]) AS a
Run Code Online (Sandbox Code Playgroud)
但是,我需要从多个数组中插入多行,所以我尝试了以下语法:
WITH p AS (
INSERT INTO parent_table (column_1)
SELECT $1
RETURNING id)
INSERT INTO child_table (parent_table_id, column_a, column_b)
SELECT p.id, a, b
FROM p, unnest($2::text[]) AS a, unnest($3::bigint[]) AS b
Run Code Online (Sandbox Code Playgroud)
我在parent_table_idand上有一个主键column_a,当我尝试执行此查询时,Postgres 抱怨重复键冲突。
应该如何解开数组以便它们形成单独的行?
换句话说,如果$2和$3都有两个条目,那么第一个条目如何$2只插入第一个条目,$3并且对于各自的第二个条目都相同?
如果这是不可能的,我可以构造一个多维数组吗?如果是这样,它应该如何与多种数组类型一起传递,多维数组语法是什么?
我有一个查询,它从源数据库 (DatabaseA) 中选择行,并将它们插入到目标数据库 (Database B) 中。数据库之间的排序规则类型不同,无法更改。我需要通过显式指定 varchar 字段的排序规则来解决查询中的排序规则差异。
目前我的查询是这样的:
INSERT INTO DatabaseB.dbo.Users(
Id,
UserNumber,
FirstName,
Surname,
Address1,
Address2,
AddressTown,
AddressCity
)
SELECT
Id,
UserNumber,
FirstName COLLATE SQL_Latin1_General_CI_AS,
Surname COLLATE SQL_Latin1_General_CI_AS,
Address1 COLLATE SQL_Latin1_General_CI_AS,
Address2 COLLATE SQL_Latin1_General_CI_AS,
AddressTown COLLATE SQL_Latin1_General_CI_AS,
AddressCity COLLATE SQL_Latin1_General_CI_AS
FROM DatabaseA.dbo.Users
Run Code Online (Sandbox Code Playgroud)
我的问题是,我可以避免为每个基于字符串的字段键入排序规则类型吗?有没有办法可以一次为整个查询指定排序规则类型?如果这是不可能的,还有其他捷径吗?
我有一个带有标识列的表,我想保留一个可用于批量插入的 id 块,同时允许插入仍然发生在该表中。
请注意,这是多个表的批量插入的一部分,其中其他表通过 FK 与这些 id 相关。因此,我需要将它们挡在外面,以便我可以事先准备好关系。
我找到了一个解决方案,它通过在事务中锁定表然后进行重新播种(非常快)来工作。但这对我来说看起来有点老套 - 这样做是否有普遍接受的模式?
create table dbo.test
(
id bigint not null primary key identity(1,1),
SomeColumn nvarchar(100) not null
)
Run Code Online (Sandbox Code Playgroud)
这是阻止(为)一些 id 的代码:
declare @numRowsToMakeRoomFor int = 100
BEGIN TRANSACTION;
SELECT MAX(Id) FROM dbo.test WITH ( XLOCK, TABLOCK ) -- will exclusively lock the table whilst this tran is in progress,
--another instance of this query will not be able to pass this line until this instance commits
--get the next id in …Run Code Online (Sandbox Code Playgroud) 我一直在看 MySQL 文档的https://dev.mysql.com/doc/refman/5.7/en/insert-delayed.html
我打算使用 INSERT DELAYED,但我发现这已被弃用。
我仍然需要这个功能来与一些处理一些非常大的数据传输的 PHP 代码兼容。我很高兴更新我的 PHP,但我现在不知道如何实现相同的功能。
既然它已被弃用,我们将如何实现与传统 INSERT DELAYED 相同的结果?
我们有一个这样定义的表:
CREATE TABLE ipsum (
id char(40) NOT NULL,
source char(40) NOT NULL,
ip_address varbinary(16) NOT NULL,
port smallint(5) unsigned NOT NULL,
percentage decimal(5,2) NOT NULL DEFAULT '0.00',
first_date datetime NOT NULL,
last_date datetime NOT NULL,
p0 tinyint(1) NOT NULL DEFAULT '0',
p1 tinyint(1) NOT NULL DEFAULT '0',
blocked tinyint(1) NOT NULL,
created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
country varchar(100) DEFAULT NULL,
continent varchar(100) DEFAULT NULL,
note varchar(100) DEFAULT NULL,
PRIMARY KEY (id),
KEY idx_first_seen_peer (first_date),
KEY idx_last_seen_peer (last_date),
KEY …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行 BULK INSERT,但出现访问被拒绝错误。到目前为止,我已经尝试了以下方法:
type使用 xp_cmdshell 文件(使用 SQL 服务帐户,但它消除了它是防火墙的想法)我使用的命令是这样的:
BULK INSERT ken_temp
FROM '\\network_path\temp\kdf\text_file.txt'
WITH
(
FIELDTERMINATOR = ',', ROWTERMINATOR = '\n'
,ROWS_PER_BATCH = 50000
,MAXERRORS = 10
)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
TL; DR:
插入大量的行的无冲突快得多比(不)重新插入相同的行,BOTH使用INSERT IGNORE语法。
为什么是这样?我假设插入和“忽略”插入的索引查找成本相同,因为 MySQL 不知道传入的数据是否具有重复/冲突的数据(因此需要被忽略)......因此,索引发生在初始插入和被忽略的插入运行中。
此外,我认为“忽略”行应该是便宜的,因为它不需要任何磁盘写入。
但这绝对不是这种情况。
长版:
在这个问题中,我们使用 AWS 的 Aurora/MySQL 和LOAD DATA FROM S3 FILE语法来删除任何传输或性能变量。我们加载了一个与下面架构相对应的 4 兆行 CSV 文件,并加载了两次,每次都使用LOAD ... IGNORE.
请注意,该问题也发生在标准INSERT ... IGNORE,但使用批量行插入时。LOAD ... IGNORE这里的用途是将讨论引向测量结果的反直觉性质,而不是“如何执行大量被忽略的插入”。这不是这里的问题,因为已经制定了特定于域的方法。
在被测试的模型中,有一个三层索引:前两个是基数非常低的可枚举分类列,第三个列本质上是“实际”数据。为了简化这个问题,我只是坚持我目前的设置。
假设以下简单模式:
our_table:
id: basic auto-increment bigint, primary key
constkey1: varchar(50) -- this is a constant in the insert
constkey2: varchar(50) -- this is a constant in the insert
datakey: varchar(50) -- this is pulled in …Run Code Online (Sandbox Code Playgroud) 我有一个巨大的表,假设有 500,000 行。我想将其(架构和数据)从一台服务器复制到另一台服务器。这不是更新插入或任何类型的更新;这是一次性的直接复制和粘贴。对此的惯用方法是什么?
我试过了:
我有一个处于FULL恢复模式的主数据库,它是Always On组的一部分。有没有办法在FULL恢复模式下最小化记录插入操作?
我有一个每天执行的进程,并在表中插入几百万条记录。随着操作的继续,事务日志文件的大小急剧增加(从 1 GB 到 40 GB)。
正如我所读到的,我可以使用一些未完INSERT全记录操作的变体,但我担心切换恢复模型的效果?
t-sql sql-server-2012 transaction-log availability-groups bulk-insert
要授予用户运行的能力Bulk Insert T-SQL command,需要授予登录/用户:
BULKADMIN服务器角色 - 或 -ADMINISTER BULK OPERATIONS服务器级别权限BULKADMIN但是服务器角色和ADMINISTER BULK OPERATIONS服务器级权限有什么区别呢?
bulk-insert ×10
sql-server ×5
insert ×2
mysql ×2
t-sql ×2
array ×1
aurora ×1
bulkcopy ×1
collation ×1
deadlock ×1
etl ×1
identity ×1
import ×1
index ×1
mysql-5.6 ×1
mysql-5.7 ×1
permissions ×1
postgresql ×1
upsert ×1