【问题标题】:UPSERT including select from another table over a list of dataUPSERT 包括从另一个表中选择数据列表
【发布时间】:2022-10-18 21:23:17
【问题描述】:

我有一组很长的数据,如果数据存在或不存在,应该插入(或更新)这些数据。

我走了这么远,但不知道我是否走在正确的轨道上。也许一些 MySQL 专家知道如何完成该语句或更正它。

我有两张桌子:

领域

id number name
1 4578 FirstArea
2 4328 SomeArea
3 3214 SecondArea

顾客

id first_name last_name identifier area_id
1 James Jameson HJ238 1
2 Pepper Potts NULL NULL
3 Peter Parker NULL 2
4 Anis Abraham NULL NULL
5 Karl Klux HI438 NULL

我想用客户数据插入或更新表Customers。到目前为止,我已经做到了:

set @last_name="James", @first_name="Jameson", @identifier="HZ732732", @cc="FirstArea";
set @last_name="Abraham", @first_name="Anis", @identifier="JI72373", @cc="SecondArea;
set @last_name="Potts", @first_name="Pepper", @identifier="KI83282", @cc="SomeArea;

set @id = (SELECT id from Customers c WHERE c.first_name = @first_name AND e.last_name = @last_name;);
set @cc_id = (SELECT id FROM Areas a WHERE aa.number = @cc;);
INSERT INTO Customers c (id, first_name, last_name, identifier, area_id) values (@id, @first_name, @last_name, @identifier, @cc_id)
ON DUPLICATE key UPDATE e.identifier = @identifier, e.area_id = @cc_id;

在这里提琴:http://www.sqlfiddle.com/#!9/cb988e

对于循环部分,我不知道,如果这与变量一起工作,我不确定。

我不仅有三个条目,而且大约有 3 个条目。要插入 450 个条目。

【问题讨论】:

  • Tips for asking a good Structured Query Language (SQL) question,尤其是“5. 一些其他建议”和“C. 考虑提供 SQL Fiddle 或 DB Fiddle”。还为提供的源数据和文件内容提供“我在单独文件中的客户数据”内容(2-3 行,代码格式)和所需的最终数据状态。
  • 这是小提琴(也在问题中添加):sqlfiddle.com/#!9/cb988e
  • 好吧,现在请阅读我评论中的第二句话并提供相应的信息。
  • 抱歉,我认为这句话具有误导性。 “在单独文件中”的数据是我写下的前三行set(以及另外 450 个条目)。条目的格式也相同,三个集合条目的格式相同。
  • “在单独文件中”的数据是我写下的前三个集合行(以及另外 450 个条目)。??您的意思是您的文件包含不明确的数据,但显示了现成的 SQL 代码?

标签: mysql loops sql-update sql-insert upsert


【解决方案1】:

调查:

CREATE TABLE Customers(
  id int unsigned NOT NULL AUTO_INCREMENT,  -- added
  first_name VARCHAR(55),
  last_name VARCHAR(55),
  identifier VARCHAR(55),
  area_id int unsigned,
  PRIMARY KEY (id),
  KEY area_id (area_id)
);

CREATE TABLE Areas(
  id int unsigned NOT NULL,
  number VARCHAR(55),
  area_name VARCHAR(55),
  PRIMARY KEY (id)
);

INSERT INTO Customers VALUES
(1, 'James', 'Jameson', 'HJ238', 1),
(2, 'Pepper', 'Potts',NULL, NULL),
(3, 'Peter', 'Parker', NULL, 2),
(4, 'Anis', 'Abraham',NULL, NULL),
(5, 'Karl', 'Klux','HI438', NULL);
SELECT * FROM Customers;

INSERT INTO Areas VALUES
(1, '4578', 'FirstArea'),
(2, '4328', 'SomeArea'),
(3, '3214', 'SecondArea');
SELECT * FROM Areas;
Records: 5  Duplicates: 0  Warnings: 0
id first_name last_name identifier area_id
1 James Jameson HJ238 1
2 Pepper Potts null null
3 Peter Parker null 2
4 Anis Abraham null null
5 Karl Klux HI438 null
Records: 3  Duplicates: 0  Warnings: 0
id number area_name
1 4578 FirstArea
2 4328 SomeArea
3 3214 SecondArea
-- the value (a row from the file) was loaded by some way
-- assigning it to the variable
SET @sql := 'set @last_name="James", @first_name="Jameson", @identifier="HZ732732", @cc="FirstArea";';

-- and execute
PREPARE stmt FROM @sql;
EXECUTE stmt;
DROP PREPARE stmt;

SELECT @last_name, @first_name, @identifier, @cc; -- check the result
Statement prepared
@last_name @first_name @identifier @cc
James Jameson HZ732732 FirstArea
set @id = (SELECT id from Customers c WHERE c.first_name = @first_name AND c.last_name = @last_name);
set @cc_id = (SELECT id FROM Areas a WHERE a.number = @cc);

SELECT @id, @cc_id; -- print for debugging purposes

INSERT INTO Customers (id, first_name, last_name, identifier, area_id) 
values (@id, @first_name, @last_name, @identifier, @cc_id)
ON DUPLICATE key UPDATE identifier = @identifier, area_id = @cc_id;
@id @cc_id
null null
SELECT * FROM Customers;
id first_name last_name identifier area_id
1 James Jameson HJ238 1
2 Pepper Potts null null
3 Peter Parker null 2
4 Anis Abraham null null
5 Karl Klux HI438 null
6 Jameson James HZ732732 null
-- next lines to be prepared/executed with further queries pack execution
SET @sql := 'set @last_name="Abraham", @first_name="Anis", @identifier="JI72373", @cc="SecondArea";';
SET @sql := 'set @last_name="Potts", @first_name="Pepper", @identifier="KI83282", @cc="SomeArea";';

fiddle


PS。修复了许多小错误和错误 - 与您的代码逐个字符进行比较。

【讨论】:

    猜你喜欢
    • 2021-12-30
    • 1970-01-01
    • 2013-01-22
    • 2017-03-08
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2014-03-20
    • 2011-03-30
    相关资源
    最近更新 更多