Добавление внешнего ключа в заполненную таблицу MYSQL

#mysql #sql #foreign-keys

#mysql #sql #внешние ключи

Вопрос:

Мне нужно добавить внешний ключ в таблицу, уже заполненную данными…

 CREATE TABLE `clientes` (
  `id_cliente` int(11) NOT NULL,
  `id_cashback` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `cashback00` (
  `id` int(11) NOT NULL,
  `valor` decimal(9,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE clientes ADD CONSTRAINT fk_cliente_cashback FOREIGN KEY (id_cashback) REFERENCES cashback(id)

 

ALTER TABLE работает только в том случае, если родительская таблица (клиенты) не заполнена.

Если в нем уже есть данные, как поступить, поскольку ALTER TABLE выдает ошибку «ошибка № 150″ Ограничение внешнего ключа неправильно сформировано »

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

1. Мы не видим таблицу кэшбэка (ССЫЛАЕТСЯ на кэшбэк (id)) или вы хотели сделать так: ССЫЛАЕТСЯ на cashback00(id)?

2. Это работает нормально, если ссылки на внешний ключ действительны: dbfiddle.uk /.

3. @John, кроме того, приятно отвечать людям, которые помогли вам с ответами и комментариями…

4. Теперь я понял ваш ответ… правильно @GordonLinoff Спасибо всем за вашу помощь

Ответ №1:

Проблема не в том, что таблица заполнена данными.

Проблема в том, что столбец, на который вы ссылаетесь, cashback(id) , не является ключом этой таблицы.

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

Поэтому я считаю, что сначала вы должны сделать это:

 ALTER TABLE cashback00 ADD PRIMARY KEY (id);
 

Но это не сработает, если у вас есть повторяющиеся значения id . Первичный ключ должен быть уникальным.

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

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

1. спасибо за проявленное внимание … на самом деле я перепутал имя дочерней таблицы для вас .. извините

Ответ №2:

Спасибо всем за вашу помощь, но мне удалось решить проблему:

Проблема целостности SGBD …

смотрите, если вы хотите добавить внешний ключ в заполненную родительскую таблицу, столбец также должен быть заполнен, например:

 UPDATE clientes
SET id_cashback = '1'
WHERE id_cliente >= '1' AND id_cliente <= '3500'

INSERT INTO cashback00 (valor) VALUES (10.00)

ALTER TABLE clientes ADD CONSTRAINT fk_cliente_cashback FOREIGN KEY (id_cashback) REFERENCES cashback(id)