xXRustamXx
@xXRustamXx

UPDATE или DELETE в таблице «users» нарушает ограничение внешнего ключа «posts_authorid_fkey» таблицы «posts»?

Создаю таблицу users:
CREATE TABLE users(
    id UUID DEFAULT uuid_generate_v4(),
    email TEXT,
    name TEXT,
    password TEXT,
    PRIMARY KEY(id)
);
INSERT INTO users(id, email, name, password) VALUES('bdfe5653-f75a-42b4-93d2-f4f739c0bc7d', 'test@mail.com', 'Jone', 'somehashedpasswprd');

Далее таблицу posts:
CREATE TABLE posts(
    id uuid DEFAULT uuid_generate_v4(),
    authorID uuid,
    text TEXT,
    FOREIGN KEY(authorID) REFERENCES users(id)
);
INSERT INTO posts(authorID, text) 
VALUES('bdfe5653-f75a-42b4-93d2-f4f739c0bc7d', 'Post description I wrote the post for demonstation how I can use of sql');

Дальше мне нужно было изменить ограничение внешнего ключа, для того чтобы после удаления пользователя, посты удалялись автоматически:
ALTER TABLE posts
    DROP CONSTRAINT authorID;

ALTER TABLE posts 
  ADD CONSTRAINT authorID 
  FOREIGN KEY(authorID) 
  REFERENCES users(id)
  ON DELETE CASCADE 
  ON UPDATE CASCADE;

Окей, ограничение дефолтное снял и добавил свое, теперь я пытаюсь удалить пользователя который был привязал к посту:
DELETE FROM users WHERE id = 'bdfe5653-f75a-42b4-93d2-f4f739c0bc7d'';

Сделать я этого не могу, пишет ошибку:
"UPDATE или DELETE в таблице "users" нарушает ограничение внешнего ключа "posts_authorid_fkey" таблицы "posts"?"

Почему?! Ведь я прописал свое ограничение и по задумке, должен был удалиться пост вместе с пользователем...
  • Вопрос задан
  • 7924 просмотра
Решения вопроса 1
@galaxy
ALTER TABLE posts
DROP CONSTRAINT authorID;

С чего вы решили, что констрейнты называются именем колонок?
Я думаю, у вас этот запрос выдал ошибку, и ваш первоначальный констрейнт не удалился.
Смотрите, какие внешние ключи есть на таблице, в psql командой \d+ posts.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
Дальше мне нужно было изменить ограничение внешнего ключа, для того чтобы после удаления пользователя, посты удалялись автоматически
Это достаточно порочный путь.
Более честные on cascade delete | update или же "в лоб" удалять вначале посты, потом юзера.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы