Lo
Lolitta

Вопрос по SQL - уникальное поле ID для трёх таблиц (нельзя вставить значения в одну, если оно есть в другой таблице).

Здравствуйте, товарищи! Помогите мне написать такой SQL код, чтобы при записи в БД, пользователь выбирал ID и в зависимости от некоторого условия (неважно какого - это я уже продумал) значение вписывалось то в одну таблицу, то в другую, а то и в третью. НО! Важно, чтобы для всех этих трёх таблиц не было повторов значений столбца ID, то есть оно уникально для всех трёх таблиц. Делаю на PhpMyAdmin с целью создания тестовой системы (вопросы могут быть с флажками, радио или письменные). Заранее благадарю Вас!

Нужно ли мне делать вспомогательный запрос SELECT `id` FROM `table1` UNION SELECT `id` FROM `table2`, а потом уже на стороне сервера ловить эти самые `id` и не давать вписывать их в `table3`?

Если слить эти три таблицы в одну с более чем 60 полями - это "тупое" решение, но вопрос: сильно ли это отразиться на скорости работы/памяти. Кто-то так делал?

Мы пришли к таким решениям:
1) сделать как в этой статье, но поле придётся делать поле auto_increment https://stackoverflow.com/questions/26578313/how-do-i-create-a-sequence-in-mysql;
2) сделать одну таблицу на 60+ полей;
3) сделать четвёртую таблицу, где будут храниться только уникальные `ID` для трёх других таблиц и связать их всех между собой.

РИ
Руслан Измайлов

В некоторых СУБД есть специальный объект - sequence или генератор, для создания уникальных значений. В MySQL такого объекта нет, но есть замена:
https://stackoverflow.com/questions/26578313/how-do-i-create-a-sequence-in-mysql
Но при использовании sequence (или аналога) пользователь не выбирает ID самостоятельно. Если пользователь сам выбирает ID, необходимо проверить, что такого ID нет во всех таблицах. Тут есть проблема: два пользователя могут одновременно выбрать один ID.

ЕК
Елена Котова(Лященко)

Сама идея что пользователь ВЫБИРАЕТ некое значение которое используется сугубо в технических целях (аутоинкрементное связующее поле) выглядит если не полным бредом то как минимум чем-то мега костыльным.
Храните идентификатор который выбирает пользователь отдельно, а идентификаторы назначайте по своим правилам.

Елена Морозова
Елена Морозова

Так в чем проблема? Садись и пиши))
Чтобы решить эту задачу хотя-бы кое-как и криво, начни с того, что разбей на более мелкие и простые подзадачи. Не нужно всё лепить в один запрос, нужно разделить на несколько. И логику желательно реализовать в виде хранимой процедуры на стороне сервера. Первым делом нужно будет запускать подзапросы SELECT MAX(ID) по всем участвующим в хранении данных таблицам. Например, из 3-х запросов SELECT MAX(ID) получаешь наибольшее значение, увеличиваешь его на 1 и находишь новое значение ID в одной из таблиц. Сохраняешь по своим условиям очередную запись в выбранную таблицу. Следующую запись после выборки нового (MAX(ID)+1) из 3-х таблиц сохраняешь в другую таблицу (или в эту же, как условие выпадет). Элементарно же. Нечего тут думать принципами ООП. Только поля ID должны быть просто целые числовые не автоинкрементные.

ТК
Татьяна Конева

В чем проблема то?
Сделайте один столбец id с инкрементом.
В каждой таблице сделайте отдельный столбец для глобального уникального global_id
Генерируйте его по формуле:

Для первой таблицы: global_id = id * 3
Для второй таблицы: global_id = (id * 3) + 1
Для третьей таблицы: global_id = (id * 3) + 2

У вас никогда не будет одинаковых значений в global_id

Это костыль, но он рабочий. Чистейшая математика

Технически можно даже не создавать столбец global_id, а просто при считывании с этой таблицы строк автоматически переводить id в global_id по формуле

Тут уже будет многое зависеть от того, как используются строки.

Более того, вы даже сможете по значению global_id определять из какой таблицы взято значение

-----
Хотя на кой я это пишу.. Там уже какие-то триггеры, доп. таблицы обсуждаются.. Куча ненужных запросов в БД..
-----
Ох, а что будет, если за id принять время создания строки в линуксоидном формате...
Или поменять стартовое и инкрементное значение..

Ладно, пойду пить кофе

МЛ
Машенька Лютенко

Не выйдет так (из-за отсутствия в такой модели вменяемого глобального объекта и возможности существования параллельных транзакций), придумай что-то другое.

Похожие вопросы
Transact SQL, как с помощью SELECT выбрать значение которое уникальное?
как в sql server в таблице найти пропущенные значения?
Надо написать sql-запрос для вывода старых и обновленных данных в одном запросе
Посчитать количество уникальных значений в определенном столбце
Вопрос по запросам SQL
Вопросы по языку SQL (запросы)
Как вычесть значение в sql?
T-sql Как в if указать столбец таблицы?
SQL Создание представления, нахождение макс/мин значения
Как задать ограничение чтобы значения в столбце были = "Муж" или "Жен"? Бд SQL Server