MySQL: при дублировании ключа обновление не работает - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть таблица с именем


FactSales (ID, dateid, customerid, salesid, salescount)

Здесь ID - автоинкремент первичного ключа.

Я также добавил уникальное ограничение, состоящее из столбцов dateid, customerid и salesid

Мои требования : вставлять / обновлять данные ежедневно, используя мой SP.

Моя проблема : Я пытался вставить ... при обновлении дубликата ключа, но он не работает.

Мой полный код здесь

-- this is creation script for factsales table
CREATE TABLE FactSales 
(
  ID           BIGINT(20) NOT NULL auto_increment,
  DateID       INT(11) DEFAULT NULL,
  CustomerID   INT(11) DEFAULT NULL,
  salesID      INT(11) DEFAULT NULL,
  salescount   INT(11) DEFAULT NULL,
  PRIMARY KEY (ID)
);

-- adding the unique constraint
ALTER TABLE FactSales ADD UNIQUE KEY uk1 (dateid,customerid,salesid);

-- creating the dummy table for work
DROP TABLE if exists tmpfactsales CREATE TABLE tmpfactsales 
(
  ID           BIGINT(20) NOT NULL auto_increment,
  DateID       INT(11) DEFAULT NULL,
  CustomerID   INT(11) DEFAULT NULL,
  salesID      INT(11) DEFAULT NULL,
  salescount   INT(11) DEFAULT NULL,
  PRIMARY KEY (ID)
);

-- now I need to get maximum of minimum last entry date of all customers
SELECT MIN(maxdate) INTO @MinMaxDateID
FROM (SELECT a.customerid,
             MAX(a.dateid) AS maxdate
      FROM factsales a
      GROUP BY a..customerID) a;

-- inserting data from min max date into dummy table
INSERT INTO tmpfactsales
(
  dateid,
  customerid,
  salesid,
  Salescount
)
SELECT dateid,
       customerid,
       salesid,
       SUM(salescount) AS salescount
FROM fact_customer_sales
WHERE status = 'active'
-- condition for daily data
AND   dateid >= @minmaxdateid
AND   dateid <= curdate()
GROUP BY dateid,
         customerid,
         salesid;


-- BEGIN Insert update on duplicate key

INSERT INTO FactSales
(
  dateid,
  customerid,
  salesid,
  salescount
)
SELECT dateid,
       customerid,
       salesid,
       salescount
FROM tmpfactsales ON duplicate KEY UPDATE factsales.salescount = tmpfactsales.salescount;

Ожидаемый результат : Обновите, если он уже существует, или вставьте новые данные в таблицу продаж фактов. В моем случае вместо этого добавляются новые записи.

подробнее о моих данных тут: https://i.stack.imgur.com/8myHO.png

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Я не могу воспроизвести вашу проблему

drop table if exists t,t1;
create table t (ID int auto_increment primary key , dateid date, customerid int, salesid int, salescount int);
create table t1 (ID int, dateid date, customerid int, salesid int, salescount int);

alter table t
    add unique key uk1(dateid,customerid,salesid);

insert into t1 values
(1,'2019-04-11',1,1,1),
(1,'2019-04-11',1,1,2);

Insert into t
(
dateid,
customerid, 
salesid,
salescount
)
select dateid,
customerid, 
salesid,
salescount
from t1 -- this is the temp table that has daily data
where t1.salescount = 1 
on duplicate key update t.salescount = t1.salescount;

Insert into t
(
dateid,
customerid, 
salesid,
salescount
)
select dateid,
customerid, 
salesid,
salescount
from t1 -- this is the temp table that has daily data 
where salescount = 2
on duplicate key update t.salescount = t1.salescount;

select * from t;

+----+------------+------------+---------+------------+
| ID | dateid     | customerid | salesid | salescount |
+----+------------+------------+---------+------------+
|  1 | 2019-04-11 |          1 |       1 |          2 |
+----+------------+------------+---------+------------+
1 row in set (0.00 sec)

Если это не очень хорошее представление о ваших данных, пожалуйста, расширьте свой вопрос, включив в него как определения таблиц, так и некоторые примеры данных.

0 голосов
/ 19 апреля 2019

Мой вопрос решен.Я создал новые таблицы и как-то работал с обновлением дубликата ключа.Не уверен, почему проблема возникла в первую очередь.

...