ЗАМЕНИТЬ В, только если оба столбца одинаковы - PullRequest
0 голосов
/ 03 января 2019

ЧТО ХОЧУ

Я хочу REPLACE INTO мой стол, только если оба column1 и column2 одинаковы. В противном случае он должен вставить INTO, даже если column1 или column2 одинаковы.

ЧТО Я ПОПЫТАЛ

Я сделал column1 и column2 ПЕРВИЧНЫЕ КЛЮЧИ.

Мой оператор SQL ...

REPLACE INTO mytable (column1, column2, column3) VALUES (?, ?, ?)

ЗАМЕНЯЕТ вместо ВСТАВКИ, даже если один из column1 или column2 одинаков.

Я пытался найти ответ, но я не знаю подходящего языка, чтобы получить правильные результаты.

EDIT

Я установил первичные ключи с помощью ..

ALTER TABLE PKweight DROP PRIMARY KEY, ADD PRIMARY KEY(id,season);

Мой столик ..

enter image description here

Я заменил REPLACE INTO на INSERT INTO и получил эту ошибку ...

PHP Fatal error:  Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'id' in

, который говорит мне, что сбой на одном дубликате столбца id.

РЕДАКТИРОВАТЬ 2

Код PHP / MYSQL ..

foreach($teamO as $tm){
    $stmt = "REPLACE INTO PKweight (id, season, name, toi, weight_toi, standing, rank) VALUES (?, ?, ?, ?, ?, ?, ?)";
    $dbConnection->prepare($stmt)->execute(["$tm->id", "$tm->season", "$tm->name", "$tm->toi", "$tm->weight_toi", "$tm->standing", "$tm->rank"]);
}

РЕДАКТИРОВАТЬ 3

Помимо составного ПЕРВИЧНОГО КЛЮЧА на id и season у меня также был УНИКАЛЬНЫЙ ИНДЕКС на id, как показано серой клавишей на скриншоте phpmyadmin выше. Я удалил это ..

ALTER TABLE PKweight DROP INDEX id

1 Ответ

0 голосов
/ 03 января 2019

Я попытался сделать то же самое, что вы упомянули, но он заменяет и вставляет на основе созданного ограничения (ограничение двух столбцов) Созданного ограничения для идентификатора и имени.

Сначала я создал таблицу:

CREATE TABLE Sakila.ReplacePrac (
Studentid INT(6) ,
Firstname VARCHAR(20),
Lastname VARCHAR(30) ,
Gender CHAR(1),
Primary key(Studentid, Firstname))  ;

insert into ReplacePrac 
select 1, 'Rob', 'Stark', 'M'  union all 
select 1, 'Ben', 'Stark', 'M'  union all  
select 2, 'Arya', 'Stark', 'F'  union all 
select 2, 'Tyrian', 'Lan', 'M' ; 

В настоящее время таблица содержит следующие данные:

# Studentid, Firstname, Lastname, Gender
    1,          Ben,      Stark,   M
    1,          Rob,      Stark,   M
    2,          Arya,     Stark,   F
    2,          Tyrian,   Lan,     M

Я добавил Заменить в предложение, и я думаю, что он заменяет всякий раз, когда ID иИмя совпадает и вставляется всякий раз, когда оно не совпадает (то есть это условие «И», а не «ИЛИ»)

Replace into Replaceprac (StudentID, Firstname, Lastname, Gender) 
Values('1', 'Jon', 'Snow', 'M'), 
('1', 'Ben', 'Snow', 'M'), 
('2', 'Sansa', 'Startk', 'F'), 
('2', 'Tyrian', 'Ster', 'M')

Оно заменяется всякий раз, когда оно получает совпадение между ИД и именем, и вставляется, когда оно когда-либо идентифицируется илиимя не совпадает.Если вы видите, он заменил Бен Старт на Бен Сноу, Тириан Лан на Тириан Стер и вставил для Джона и Сансы, даже если ID уже существовал.

# Studentid, Firstname, Lastname, Gender
      1,       Ben,       Snow,      M
      1,       Jon,       Snow,      M
      1,       Rob,       Stark,     M
      2,       Arya,      Stark,     F
      2,       Sansa,     Startk,    F
      2,       Tyrian,    Ster,      M
...