我有一个存储过程需要插入到三个不同的表中,但我需要从一个输入中获取生成的ID并使用它插入到下一个表中.我对这个INSERT-OUTPUT结构很熟悉,但我不确定如何在这种特殊情况下使用它.
DECLARE @guids TABLE ( [GUID] UNIQUEIDENTIFIER );
DECLARE @contacts TABLE ( [ContactID] INT, [GUID] UNIQUEIDENTIFIER );
DECLARE @mappings TABLE ( [TargetID] INT, [GUID] UNIQUEIDENTIFIER );
INSERT @guids ( [GUID] ) ...
INSERT [Contacts] ( [FirstName], [LastName], [ModifiedDate] )
OUTPUT [inserted].[ContactID], g.[GUID]
INTO @contacts
SELECT [First_Name], [Last_Name], GETDATE()
FROM [SourceTable] s
JOIN @guids g ON s.[GUID] = g.[GUID]
INSERT [TargetTable] ( [ContactID], [License], [CreatedDate], [ModifiedDate] )
OUTPUT [inserted].[TargetID], c.[GUID]
INTO @mappings
SELECT c.[ContactID], [License], [CreatedDate], [CreatedDate]
FROM [SourceTable] …Run Code Online (Sandbox Code Playgroud) 我需要在表中插入唯一值,并且需要记录的id,需要在关系表中插入那些id,如果不存在则需要查询插入记录返回inset id,如果存在则返回记录主键(id ).
我想为多个值做这个,比如橙色,芒果,香蕉,就像批量插入一样.
模式:
------------
id | tag |
------------
1 | orange|
------------
Run Code Online (Sandbox Code Playgroud)
我把这个记录为一个记录
INSERT INTO `tags` (`tag`)
SELECT 'myvalue1'
FROM tags
WHERE NOT EXISTS (SELECT 1 FROM `tags` WHERE `tag`='myvalue1')
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
发布问题以找出一些优化的解决方案,我不想在代码中使用额外的循环来匹配db的值.
在SQL中,将Select into ...行复制到不同的(备份)表中.如果备份表具有不同的结构(或不同的列名),这可能吗?如果没有,实现这一目标的最佳方法是什么?
这是我想要做的:TableA有列a1,a2,a3.我想将此表中的一些行复制到另一个TableB具有列的表中b1,b2,b3,b4.内容a1进入b1,a2对b2等
我有一个mysql表ip_list...
+----+---------------+
| id | ip_addr |
+----+---------------+
| 1 | 192.168.100.1 |
| 2 | 192.168.100.2 |
| 3 | 192.168.100.3 |
| 4 | 192.168.100.4 |
| 5 | 192.168.100.5 |
+----+---------------+
Run Code Online (Sandbox Code Playgroud)
我想只添加不在ip_addr列中的记录.
对于前者
我有以下记录添加到ip_addr表中
192.168.100.6
192.168.100.10
192.168.100.11
192.168.100.1 //already in column
192.168.100.12
Run Code Online (Sandbox Code Playgroud)
我不想添加192.168.100.1,因为它已经在列中.
那么,INSERT查询是否有可能首先检查记录然后插入它?
目前,我正在这样做..首先我SELECT记录然后匹配它然后INSERT它.
但是,我只想做一个查询.
我有一张桌子.每个人都有财产,许多人可能拥有某些财产.所以这是一个多对多的关系.这是架构:
CREATE TABLE persons (
person_id int(11) NOT NULL AUTO_INCREMENT,
firstname varchar(30) NOT NULL,
lastname varchar(30) NOT NULL,
PRIMARY KEY (person_id)
);
CREATE TABLE properties (
property_id int(11) NOT NULL AUTO_INCREMENT,
property varchar(254) NOT NULL UNIQUE,
PRIMARY KEY (property_id)
);
CREATE TABLE has_property (
person_id int(11) NOT NULL,
property_id int(11) NOT NULL,
PRIMARY KEY (person_id,property_id),
FOREIGN KEY (person_id) REFERENCES persons (person_id),
FOREIGN KEY (property_id) REFERENCES properties (property_id)
);
Run Code Online (Sandbox Code Playgroud)
现在让我说我想向这个人插入数据库:
人
+-----------+-----------+----------+
| person_id | …Run Code Online (Sandbox Code Playgroud) 我试图用node.js插入一些数据.我已经编写了以下代码并通过npm安装了MySQL支持,但我未能成功INSERT INTO.
这是我的代码:
var mysql = require('mysql');
function BD() {
var connection = mysql.createConnection({
user: 'root',
password: '',
host: 'localhost',
port: 3306,
database: 'nodejs'
});
return connection;
}
app.post("/user/create", function(req, res) {
var objBD = BD();
var post = {
username: req.body.username,
password: req.body.password
};
objBD.query('INSERT INTO users VALUES ?', post, function(error) {
if (error) {
console.log(error.message);
} else {
console.log('success');
}
});
});
Run Code Online (Sandbox Code Playgroud)
HTML代码:
<form action="/user/create" method="POST" class="form-horizontal">
<input type="text" id="username_input" name="username">
<input type="text" id="password_input" name="password">
<input …Run Code Online (Sandbox Code Playgroud) 今天,我花了一天时间来改进我的Python脚本的性能,该脚本将数据推送到我的Postgres数据库中.我以前是这样插入记录的:
query = "INSERT INTO my_table (a,b,c ... ) VALUES (%s, %s, %s ...)";
for d in data:
cursor.execute(query, d)
Run Code Online (Sandbox Code Playgroud)
然后我重新编写了我的脚本,以便创建一个内存文件,而不是用于Postgres的COPY命令,它允许我将数据从文件复制到我的表:
f = StringIO(my_tsv_string)
cursor.copy_expert("COPY my_table FROM STDIN WITH CSV DELIMITER AS E'\t' ENCODING 'utf-8' QUOTE E'\b' NULL ''", f)
Run Code Online (Sandbox Code Playgroud)
这种COPY方法速度惊人.
METHOD | TIME (secs) | # RECORDS
=======================================
COPY_FROM | 92.998 | 48339
INSERT | 1011.931 | 48377
Run Code Online (Sandbox Code Playgroud)
但我找不到任何关于为什么的信息?它与多线程的工作方式有何不同INSERT,使其更快?
也看到这个基准:
# original
0.008857011795043945: query_builder_insert
0.0029380321502685547: copy_from_insert
# 10 records …Run Code Online (Sandbox Code Playgroud) 从MySQL 4.1.0开始,ON DUPLICATE KEY UPDATE当插入的值(带INSERT或SET或VALUES)已经在目标表wrt PRIMARY KEY或某个UNIQUE字段中时,可以添加语句来指定行为.如果PRIMARY KEY某个UNIQUE字段的值已经在表中,INSERT则替换为UPDATE.
ON DUPLICATE KEY UPDATE如果UNIQUE我的表中有多个字段,表现
如何?
如果两个UNIQUE字段匹配,我可以只有一个更新吗?
只有当两个UNIQUE字段同时匹配时才能更新吗?
我试图从一个表中删除一行,并将一些额外的数据插入另一个表.我知道这可以在两个单独的命令中完成,一个用于删除,另一个用于插入新表.但是我试图将它们组合起来并且它不起作用,这是我目前的查询:
insert into b (one,two,num) values delete from a where id = 1 returning one, two, 5;
运行时,我收到以下错误:
错误:"删除"或附近的语法错误
任何人都可以指出如何实现这一目标,还是有更好的方法?还是不可能?
我使用postgresql和yii2框架.我收到了一条非常有趣的错误消息:
SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column "id" violates not-null constraint
DETAIL: Failing row contains (null, 1, null, null, null, null, 1, Demo, , , , 1998-01-01, , , , 345345435453453, , , , , 1, , , f, f, f, f, 10, f, 1, f, f, f, null, null, null, 1470477479, 1470477479, null).
Run Code Online (Sandbox Code Playgroud)
但我检查了我的插入命令,那里没有"id"列!
INSERT INTO "advertiser" ("languages", "type", "name", "display_name", "title", "about", "birthday", "gender", "country_id", "county_id", "city_id", "city_part", "street", "house_number", "phone", "public_email", "public_url", "motto", …Run Code Online (Sandbox Code Playgroud) sql-insert ×10
mysql ×5
sql ×5
postgresql ×3
many-to-many ×1
node-mysql ×1
node.js ×1
null ×1
php ×1
python ×1
relationship ×1
sql-delete ×1
sql-server ×1
sql-update ×1
sqlite ×1
t-sql ×1
upsert ×1
yii ×1