我正在尝试将一些网络应用程序逻辑转移到 postgres 函数中。但是我在创建一个非常基本的插入函数时遇到了一些错误。
这是我正在尝试创建的功能;
CREATE OR REPLACE FUNCTION create_user(IN email EMAIL, password TEXT, thumb TEXT)
RETURNS text AS
$BODY$
BEGIN
insert into users (unqid, thumb, email, password)
values (gen_random_uuid(), thumb, email, password)
returning unqid ;
END;
$BODY$
LANGUAGE plpgsql
VOLATILE
Run Code Online (Sandbox Code Playgroud)
如果插入成功,我试图让函数返回项目的 uuid。我这样称呼它;
select * from create_user('newuser@mail.com', 'passpopcorn', 'thumbelinaurl');
Run Code Online (Sandbox Code Playgroud)
收到此错误;
SQL Error [42601]: ERROR: query has no destination for result data
Where: PL/pgSQL function create_user(email,text,text) line 3 at SQL statement
Run Code Online (Sandbox Code Playgroud)
从我的谷歌搜索看来,当查询中没有 return 语句时,似乎会出现此错误。但在我的插入查询中,我确实有一个返回语句。
额外问题;对于简单的插入语句(例如这里的这个语句,或者带有几个选择后跟一个插入的语句),函数或过程会是更好的选择吗?
假设我有一个以下形式的查询:
INSERT INTO tableA (...) select ... from tableB;
Run Code Online (Sandbox Code Playgroud)
现在,这个查询在执行时是否有可能阻止普通INSERT语句tableB?附加信息:
FOR UPDATE语句中没有子句SELECT(我什至不确定是否可以在INSERT...SELECT构造中做到这一点)REPEATABLE READ我有一个表 1800 万条记录我需要将它添加到另一个表(具有相同的结构) 我尝试了导入导出向导,问题是日志变得非常大,最终它关闭了整个服务器,我不得不在中间终止进程。
我想如果我分批进行它会更快,但我不知道该怎么做。
(我不需要旧表,可以删除已复制的记录)
编辑:批量插入阻止所有操作,有没有办法阻止他在这里阻止所有人?
我正在尝试将数据从一个数据库系统转换为另一个数据库系统。我需要传输和格式化的表之一包含超过 1000 万行。
我正在运行以下脚本来做到这一点:
USE [Cvti101687]
go
truncate table [IDAT_MR_NOTEHISTORY]
go
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[IDAT_MR_NOTEHISTORY]') AND name = N'PK_iMR_NOTES')
ALTER TABLE [dbo].[IDAT_MR_NOTEHISTORY] DROP CONSTRAINT [PK_iMR_NOTES]
GO
USE [101687_test2]
GO
declare @ChunkCounter int
declare @ChunkSize int
set @ChunkCounter = 0
set @ChunkSize = 50000
--hack to do a do-while loop in sql
while 1 = 1
begin
insert into cvti101639..IDAT_MR_NOTEHISTORY with (tablock)
SELECT newid(), '00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000000'
,'00000000-0000-0000-0000-000000000000', ISNULL(TargetClientAccountNum, [REC_CLINUM]), ISNULL(TargetPetAccountNum, ' ')
,ISNULL(pck_desc, 'Converted …Run Code Online (Sandbox Code Playgroud) 我遇到了一个相当复杂的查询问题,我需要将一个表中的 id(基于重标准)存储到一个狭窄的备用表中以供将来参考,但我一直遇到错误的 sql 构造错误。
如果我自己运行以下查询,它可以正常工作:
(SELECT DISTINCT a.id FROM accounts AS a
WHERE a.createdate >= date_sub(now(), INTERVAL 1 YEAR)
AND a.email NOT LIKE '%gmail.com')
UNION DISTINCT
(SELECT DISTINCT a.id FROM accounts AS a
WHERE a.createdate < date_sub(now(), INTERVAL 1 YEAR)
AND a.email NOT LIKE '%yahoo.com') AND a.email NOT IN
(SELECT email FROM inactive_clients));
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试像这样运行相同的查询:
INSERT INTO my_backup_table (account_id) VALUES ($aboveQuery);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
MySQL server version for the right syntax to use near 'UNION DISTINCT (SELECT DISTINCT a.id FROM accounts at line …Run Code Online (Sandbox Code Playgroud) 在 Oracle 中,给定以下对象:
create table a (x number );
create table b (val number );
create table c (val number );
create sequence my_seq;
Run Code Online (Sandbox Code Playgroud)
假设我a按如下方式填充表:
insert into a (x) values (1);
insert into a (x) values (2);
insert into a (x) values (3);
insert into a (x) values (4);
Run Code Online (Sandbox Code Playgroud)
使用 中的值a,我想填充表b,c如下所示:当a.x为偶数时,从序列中生成一个新数字并插入my_seq.nextval到b.valand 中c.val;否则,将my_seq.currval(最近生成的值但不是新值)插入到c.val.
我目前拥有的是一个 insert all 语句,如下所示:
insert all
when mod(x,2) …Run Code Online (Sandbox Code Playgroud) 我需要编写一个只插入一行的查询,即使该查询运行多次。作为 SQL 的新手(以及新的),我做了一个,if not exists(...)但一个朋友说他更喜欢删除该行,如果它存在,然后再次添加它。
EXISTS或反之亦然可能有什么好处?你能帮我解决一个问题吗。任务是在 MySQL 数据库中插入一条记录。条款:
表 'NETFLOW'.'Month' 中的关键列是:
事情是尽快查询,如果可能的话,在一个查询中。
当前查询的文本是:
INSERT INTO `netflow`.`Month` (`Year`, `Month`, `Day`, `Hour`, `srcaddr`,`dstaddr`, `doctets`)
(
SELECT
YEAR( FROM_UNIXTIME( `unix_secs` ) ) AS `YEAR`,
MONTH( FROM_UNIXTIME( `unix_secs` ) ) AS `MONTH`,
DAYOFMONTH( FROM_UNIXTIME( `unix_secs` ) ) AS `DAY`,
HOUR( FROM_UNIXTIME( `unix_secs` ) ) AS `HOUR`,
`srcaddr` ,
`dstaddr` ,
`doctets`
FROM `netflow`.`raw`
WHERE `unix_secs` <= 1394179200
GROUP BY
`YEAR`,
`MONTH`,
`DAY`,
`HOUR`,
`srcaddr`,
`dstaddr`
)
ON …Run Code Online (Sandbox Code Playgroud) 我目前使用以下语句,对于 10,000 行,大约需要 150 秒。我尝试删除目标表上的索引,但这没有帮助。在没有INSERT INTO50ms 的情况下运行循环。我需要它来更新大约 3 亿行,我真的等不及 52 天 (!) 才能完成。
以下更新查询的底线是我需要遍历每一行,对 a 执行计算VARBINARY并从中提取正确的值(我们需要去掉打包的VARBINARY字段),并将其存储在一个新表中。
FETCH NEXT FROM LocCities INTO @LocCity
WHILE (@@FETCH_STATUS = 0)
BEGIN
-- several sets, removed calculations for clarity
SET @LocationId = Calculation1()
SET @CityId = Calculation2()
IF(@LocCity <> 0)
BEGIN
-- left out an inner loop here on the VARBINARY based on its length
INSERT INTO LocationCities (LocationId, CityId)
VALUES (@LocationId, @CityId)
END
FETCH NEXT FROM RespCursor INTO …Run Code Online (Sandbox Code Playgroud) 使用mergeoverinsert函数有什么优点/缺点吗?可在insert声明中利用'OUTPUT的”
注意: 的ON子句merge设置为1=0(始终插入)
Merge DeviceReading
Using (
--table here
) As [Source]
On (1 = 0) -- Effectively Makes this an Insert as 1 Never Matches 0
When Not Matched Then
INSERT (
[value1],
[value2]
) VALUES (
@value1,
@value2
) OUTPUT Inserted.[value1], Inserted.[value2] Into @InsertIDTable;
Run Code Online (Sandbox Code Playgroud) insert ×10
mysql ×3
sql-server ×3
performance ×2
blocking ×1
bulk ×1
bulkcopy ×1
duplication ×1
functions ×1
hints ×1
locking ×1
mariadb ×1
merge ×1
oracle ×1
postgresql ×1
select ×1
sequence ×1
union ×1