У меня есть таблица под названием "Пользователи", в которой содержатся некоторые поля, такие как Id, ParentId, Name.
Я хочу изменить эту таблицу, чтобы добавить новое отношение self join, чтобы ссылка ParentId на Id, но ParentId имеет значение NULL.
Я хочу написать этот alter sql statment в mysql, не отбрасывая таблицу.
Вы хотите сказать, что хотите добавить ограничение внешнего ключа? Если это так, см. FOREIGN KEY Constraints docs. Вот пример, начиная с создания простой таблицы:
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Добавьте индекс для столбца parent_id
:
ALTER TABLE users
ADD INDEX `parent_id` (`parent_id`);
Добавьте ограничение внешнего ключа:
ALTER TABLE users
ADD CONSTRAINT `fk_parent_id`
FOREIGN KEY `parent_id` (`parent_id`)
REFERENCES `users` (`id`);
Показать новую структуру таблицы:
SHOW CREATE TABLE users;
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`),
CONSTRAINT `fk_parent_id`
FOREIGN KEY (`parent_id`)
REFERENCES `users` (`id`)
) ENGINE=InnoDB;
alter table Users add constraint parent foreign key (ParentId) references
Users (Id);
Обратите внимание, что если вы работаете с таблицей, содержащей данные, создание отношений с внешним ключом завершится неудачей, если существуют сиротские отношения. Найти и исправить сирот перед созданием внешних ключей!
SELECT * FROM users
WHERE parent_id
NOT IN (SELECT ID FROM users
);