标签: insert

如何创建一个返回值的 postgres 函数

我正在尝试将一些网络应用程序逻辑转移到 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 语句时,似乎会出现此错误。但在我的插入查询中,我确实有一个返回语句。

额外问题;对于简单的插入语句(例如这里的这个语句,或者带有几个选择后跟一个插入的语句),函数或过程会是更好的选择吗?

postgresql insert functions

3
推荐指数
1
解决办法
8670
查看次数

MySQL/MariaDB:SELECT 查询可以阻止 INSERT 查询吗?

假设我有一个以下形式的查询:

INSERT INTO tableA (...) select ... from tableB;
Run Code Online (Sandbox Code Playgroud)

现在,这个查询在执行时是否有可能阻止普通INSERT语句tableB?附加信息:

  • 所有表都是InnoDB
  • 没有显式事务(自动提交已打开)
  • FOR UPDATE语句中没有子句SELECT(我什至不确定是否可以在INSERT...SELECT构造中做到这一点)
  • 实际的 SELECT 查询显然更复杂,涉及分组和联合,但这些不应该改变任何东西,对吧?
  • 所有查询的事务隔离级别是默认的REPEATABLE READ
  • 准确的数据库版本是MariaDB 10.0.12

mysql mariadb insert locking blocking

3
推荐指数
1
解决办法
1160
查看次数

批量将数据从一张表移动到另一张表

我有一个表 1800 万条记录我需要将它添加到另一个表(具有相同的结构) 我尝试了导入导出向导,问题是日志变得非常大,最终它关闭了整个服务器,我不得不在中间终止进程。

我想如果我分批进行它会更快,但我不知道该怎么做。

(我不需要旧表,可以删除已复制的记录)

编辑:批量插入阻止所有操作,有没有办法阻止他在这里阻止所有人? 在此处输入图片说明

sql-server-2005 insert bulkcopy

2
推荐指数
1
解决办法
3540
查看次数

删除聚簇索引后,仍然在尝试做聚簇插入

我正在尝试将数据从一个数据库系统转换为另一个数据库系统。我需要传输和格式化的表之一包含超过 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)

sql-server-2005 sql-server clustered-index insert bulk

2
推荐指数
1
解决办法
164
查看次数

MySQL - INSERT INTO ... SELECT ... UNION

我遇到了一个相当复杂的查询问题,我需要将一个表中的 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)

mysql insert union

2
推荐指数
1
解决办法
1万
查看次数

在多表插入中限制生成的序列值

在 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,我想填充表bc如下所示:当a.x为偶数时,从序列中生成一个新数字并插入my_seq.nextvalb.valand 中c.val;否则,将my_seq.currval(最近生成的值但不是新值)插入到c.val.

我目前拥有的是一个 insert all 语句,如下所示:

insert all 
    when mod(x,2) …
Run Code Online (Sandbox Code Playgroud)

oracle insert sequence

2
推荐指数
1
解决办法
1700
查看次数

检查行是否存在

我需要编写一个只插入一行的查询,即使该查询运行多次。作为 SQL 的新手(以及新的),我做了一个,if not exists(...)但一个朋友说他更喜欢删除该行,如果它存在,然后再次添加它。

  • 删除EXISTS或反之亦然可能有什么好处?
  • 还有另一种方法吗?

sql-server-2008 sql-server insert if-not-exists

2
推荐指数
1
解决办法
1557
查看次数

在重复密钥更新时插入 ... (...) (Select...)

你能帮我解决一个问题吗。任务是在 MySQL 数据库中插入一条记录。条款:

  • 如果记录存在 - 更新记录。
  • 如果记录不存在 - 创建一个新的。

表 'NETFLOW'.'Month' 中的关键列是:

  • '年'
  • '月'
  • '日'
  • '小时'
  • '源地址'
  • 'dstaddr'。

事情是尽快查询,如果可能的话,在一个查询中。

当前查询的文本是:

    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)

mysql insert duplication select

2
推荐指数
1
解决办法
2万
查看次数

如何加速循环 INSERT INTO 语句?

我目前使用以下语句,对于 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)

performance insert hints sql-server-2008-r2

2
推荐指数
1
解决办法
3146
查看次数

合并比插入快

使用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)

performance sql-server insert merge

2
推荐指数
1
解决办法
9307
查看次数