Nano Hash - криптовалюты, майнинг, программирование

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

Может ли один и тот же столбец иметь первичный ключ и ограничение внешнего ключа для другого столбца?

Table1: ID - Primary column, foreign key constraint for Table2 ID
Table2: ID - Primary column, Name 

Будет ли это проблемой, если я попытаюсь удалить данные таблицы 1?

Delete from table1 where ID=1000;

Спасибо.

23.09.2010


Ответы:


1

С этим не должно быть проблем. Рассмотрим следующий пример:

CREATE TABLE table2 (
   id int PRIMARY KEY,
   name varchar(20)
) ENGINE=INNODB;

CREATE TABLE table1 (
   id int PRIMARY KEY, 
   t2_id int, 
   FOREIGN KEY (t2_id) REFERENCES table2 (id)
) ENGINE=INNODB;

INSERT INTO table2 VALUES (1, 'First Row');
INSERT INTO table2 VALUES (2, 'Second Row');

INSERT INTO table1 VALUES (1, 1);
INSERT INTO table1 VALUES (2, 1);
INSERT INTO table1 VALUES (3, 1);
INSERT INTO table1 VALUES (4, 2);

Теперь таблицы содержат:

SELECT * FROM table1;
+----+-------+
| id | t2_id |
+----+-------+
|  1 |     1 |
|  2 |     1 |
|  3 |     1 |
|  4 |     2 |
+----+-------+
4 rows in set (0.00 sec)

SELECT * FROM table2;
+----+------------+
| id | name       |
+----+------------+
|  1 | First Row  |
|  2 | Second Row |
+----+------------+
2 rows in set (0.00 sec)

Теперь мы можем успешно удалить строки следующим образом:

DELETE FROM table1 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)

DELETE FROM table1 WHERE t2_id = 2;
Query OK, 1 row affected (0.00 sec)

Однако мы не сможем удалить следующее:

DELETE FROM table2 WHERE id = 1;
ERROR 1451 (23000): A foreign key constraint fails

Если бы мы определили внешний ключ для table1 с помощью CASCADE, мы могли бы удалить родителя, и все дочерние элементы были бы удалены автоматически:

CREATE TABLE table2 (
   id int PRIMARY KEY,
   name varchar(20)
) ENGINE=INNODB;

CREATE TABLE table1 (
   id int PRIMARY KEY, 
   t2_id int, 
   FOREIGN KEY (t2_id) REFERENCES table2 (id) ON DELETE CASCADE
) ENGINE=INNODB;

INSERT INTO table2 VALUES (1, 'First Row');
INSERT INTO table2 VALUES (2, 'Second Row');

INSERT INTO table1 VALUES (1, 1);
INSERT INTO table1 VALUES (2, 1);
INSERT INTO table1 VALUES (3, 1);
INSERT INTO table1 VALUES (4, 2);

Если мы повторим предыдущую неудачную операцию DELETE, дочерние строки в table1 будут удалены так же, как и родительская строка в table2:

DELETE FROM table2 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)

SELECT * FROM table1;
+----+-------+
| id | t2_id |
+----+-------+
|  4 |     2 |
+----+-------+
1 row in set (0.00 sec)

SELECT * FROM table2;
+----+------------+
| id | name       |
+----+------------+
|  2 | Second Row |
+----+------------+
1 row in set (0.00 sec)
23.09.2010
  • Пожалуйста, поправьте меня, если я ошибаюсь, но я не понимаю, как это отвечает на вопрос. (И почему это было принято.) Вопрос заключается в том, можем ли мы иметь один и тот же столбец с ограничением первичного ключа и внешнего ключа для другого столбца. Принятый ответ вводит второй столбец (t2_id) в качестве внешнего ключа, он не показывает столбец, который является как первичным ключом, так и внешним ключом. 27.01.2015
  • И я думал, что найду ответ здесь :/ 11.03.2015
  • Этот ответ не где о заданном вопросе. Не знаю, почему это было принято. Я прочитал полный ответ (длинный), учитывая, что это был принятый ответ, а затем нашел его неактуальным. 15.06.2021

  • 2

    Назначение первичного ключа и внешнего ключа одному и тому же столбцу в таблице:

    create table a1 (
        id1 int not null primary key 
    );
    insert into a1 values(1),(2),(3),(4);
    
    create table a2 (
        id1 int not null primary key foreign key references a1(id1)
    );
    insert into a2 values(1),(2),(3);
    
    19.01.2017

    3

    Да, оно может.

    Нет, не будет.

    P.S. Но вы не сможете удалить данные table2 без удаления соответствующих строк table1.

    П.П.С. Я реализовал такую ​​структуру в Postgres, но она должна быть аналогична для MySQL.

    21.07.2016

    4

    Ответ, предоставленный Джейсоном, возможно, когда-то работал, но когда я попытался использовать этот ответ в 2021 году на сервере MySQL 5.7, он жалуется. Синтаксис, который я использовал, чтобы заставить это работать, был;

    CREATE TABLE a1 (
        id1 INT NOT NULL PRIMARY KEY
    );
    INSERT INTO a1 VALUES (1),(2),(3),(4);
    
    CREATE TABLE a2 (
        id1 INT NOT NULL,
        PRIMARY KEY (id1),
        CONSTRAINT `fk_id1` FOREIGN KEY (id1) REFERENCES a1(id1)
    );
    INSERT INTO a2 VALUES (1),(2),(3);
    

    Для взаимно-однозначных отношений этого типа я также настоятельно рекомендую создавать внешние ключи как;

    CONSTRAINT `fk_id1` FOREIGN KEY (id1) REFERENCES a1(id1) ON DELETE CASCADE
    
    11.02.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..