#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)