MySQL — обновление записи и поддержание ссылочной целостности

#php #mysql #sql

#php #mysql #sql

Вопрос:

Я работаю в MySQL 5.5.

У меня есть таблица контактов, подобная этой

CREATE TABLE Contacts
(
ID INTEGER NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(255) NOT NULL,
Institution VARCHAR(255),
Address VARCHAR(255),
Email VARCHAR(255) NOT NULL UNIQUE,
Phone VARCHAR(10)
);
и таблицы инвентаризации, подобные этой

CREATE TABLE Inventories
(
ID INTEGER NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT,
InventoryParametersID INTEGER NOT NULL UNIQUE,
ContactID INTEGER NOT NULL,
LocationID INTEGER NOT NULL,
Year INTEGER,
DateUploaded TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
Comments VARCHAR(255),
FOREIGN KEY (ContactID) REFERENCES Contacts(ID)
);
В моей веб-форме контакты загружают инвентаризацию. Вот поведение, которое я хочу: — Когда новый контакт загружает инвентарь, сделайте вставку с их новой информацией — Когда существующий контакт (определяемый по адресу электронной почты) загружает другой инвентарь, обновите их информацию И сохраните ссылочную целостность с помощью таблицы инвентаризации

Как мне это сделать?

Вот что я пробовал:

СЛУЧАЙ

 FOREIGN KEY (ContactID) REFERENCES Contacts(ID)

REPLACE INTO Contacts (`Name`, `Institution`, `Address`, `Email`, `Phone`) VALUES (?, ?, ?, ?, ?);
  

Результат

 No change
  

СЛУЧАЙ

 FOREIGN KEY (ContactID) REFERENCES Contacts(ID)

    ON UPDATE CASCADE

REPLACE INTO Contacts (`Name`, `Institution`, `Address`, `Email`, `Phone`) VALUES (?, ?, ?, ?, ?);
  

Результат

 No change
  

Комментарии:

1. ЗАМЕНА удаляет строку поиска и добавляет новую. Таким образом, ваш КАСКАД ОБНОВЛЕНИЯ не работает. Почему вы не используете INSERT … ПРИ ОБНОВЛЕНИИ ДУБЛИКАТА КЛЮЧА?

2. Это то, над чем я сейчас работаю, но у меня возникли проблемы с пониманием синтаксиса. У вас есть ссылка на хороший пример, отличный от документов MySQL?

3. ВСТАВИТЬ В контакты ( Name , Institution , Address , Email , Phone ) ЗНАЧЕНИЯ (?, ?, ?, ?, ?) ПРИ ДУБЛИРОВАНИИ КЛЮЧА ОБНОВИТЕ Name = VALUES(ИМЯ), Institution = VALUES(Учреждение) … MySQL-DOC

4. Я понял: ВСТАВИТЬ В ЗНАЧЕНИЯ Contacts ( Name , Institution , Address , Email , Phone ) (?, ?, ?, ?, ?) ПРИ ОБНОВЛЕНИИ ДУБЛИКАТА КЛЮЧА Name =?, Institution =?, Address =?, Phone =?;

5. Вы можете использовать VALUES( columnname ) в своих обновлениях, тогда вы не установили значения, если используете подготовленный оператор.

Ответ №1:

ЗАМЕНА удаляет строку поиска и добавляет новую. Таким образом, ваш КАСКАД ОБНОВЛЕНИЯ не работает. Почему вы не используете INSERT … ПРИ ОБНОВЛЕНИИ ДУБЛИКАТА КЛЮЧА?

 INSERT INTO Contacts (Name, Institution, Address, Email, Phone) 
VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE 
Name = VALUES(NAME), 
Institution = VALUES(Institution) ...
  

MySQL DOC