Безопасно ли иметь столбец datetime в качестве внешнего ключа в таблице?

У меня есть две таблицы. Таблицы A и B. В таблице A есть столбец с автоинкрементом в качестве первичного ключа.

id    name       date_created
1     Kletian    12-12-12 12:12:12
2     Vormav     12-12-12 12:12:13
3     Agrias     12-12-12 12:12:14
4     Ramza      12-12-12 12:12:15

Таблица B должна иметь внешний ключ, ссылающийся на идентификатор в таблице A. Но, поскольку идентификатор является автоинкрементным (генерируется mysql), я не могу назначить его с помощью программирования на стороне сервера (я использую PHP для вставки). Но в таблице A есть столбец date_created с атрибутом datetime.

Обычно эта таблица B должна выглядеть так:

id     images
1      abc.jpg
1      def.png
1      ghi.jpg
2      jkl.png
3      mno.jpeg
3      pqr.png

и это мой план для таблицы B:

date_created           images
12-12-12 12:12:12      abc.jpg
12-12-12 12:12:12      def.png
12-12-12 12:12:12
12-12-12 12:12:13
12-12-12 12:12:14
12-12-12 12:12:14      pqr.png

Замечания:

  • Получение значения автоматического приращения с помощью программирования на стороне сервера (PHP) не является надежным. Так как пользователь может удалить запись и испортить порядок.
  • У меня ограниченные права на изменение структуры таблицы. Незначительные изменения в порядке, но значительные изменения запрещены.
  • Мой план безопасен или есть другие альтернативы?

0

Решение

Порядковый номер: Возьмите один столбец в таблице который вы увеличиваете при вставке новой записи (не автоинкремент), например:

seq_no | name
1    |  Kletian
3    |  Agrias

Поэтому, когда вы хотите сделать новую запись в таблице , просто получить MAX() из seq_no и увеличить его на 1.

Также в таблице B сделайте seq_no как внешний ключ, как:

seq_no | images
1    |  abc.jpg
3    |  efg.jpg
0

Другие решения

Вот что вы хотели бы для своей таблицы DDL (схема):

CREATE TABLE IF NOT EXISTS `table_a` (
`id`                  MEDIUMINT   NOT NULL AUTO_INCREMENT,
`name`                TEXT        NOT NULL,
`created_date`        TIMESTAMP   NOT NULL DEFAULT NOW(),
PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `table_b` (
`id`                  MEDIUMINT   NOT NULL AUTO_INCREMENT,
`image`               TINYTEXT    NOT NULL,
`created_date`        TIMESTAMP   NOT NULL DEFAULT NOW(),
`table_a_id`          MEDIUMINT   NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`table_a_id`) REFERENCES table_a(id) ON DELETE CASCADE
);

Таблица Б будет иметь ссылку на внешний ключ Таблица А.

Я не уверен, что смогут внести эти изменения, но это было бы идеальным решением.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector