Стремясь избежать автоматических порядковых номеров и тому подобного в той или иной причине в этой конкретной базе данных, я подумал, может ли кто-нибудь увидеть какие-либо проблемы с этим:
INSERT INTO user (label, username, password, user_id)
SELECT 'Test', 'test', 'test', COALESCE(MAX(user_id)+1, 1) FROM user;
Я использую PostgreSQL (но также пытаюсь быть максимально независимым от базы данных) ..
EDIT:
Есть две причины, по которым я хочу сделать это.
- Сохранение зависимости от любого конкретного уровня СУБД.
- Не нужно беспокоиться об обновлении последовательностей, если данные пакетно обновляются в центральной базе данных.
Производительность вставки не является проблемой, поскольку единственные таблицы, где это потребуется, - это таблицы настройки.
EDIT-2:
Идея, с которой я играю, состоит в том, что каждая таблица в базе данных имеет созданный человеком SiteCode как часть их ключа, поэтому у нас всегда есть составной ключ. Это эффективно разделяет данные на SiteCode и позволяет брать данные с определенного сайта и помещать их в другое место (очевидно, в той же структуре базы данных). Например, это позволит создавать резервные копии различных рабочих сайтов в одной центральной базе данных, но также позволит этой центральной базе данных иметь рабочие сайты, использующие ее.
Я все еще могу использовать последовательности, но это кажется грязным. Фактическая вставка выглядела бы так:
INSERT INTO user (sitecode, label, username, password, user_id)
SELECT 'SITE001', 'Test', 'test', 'test', COALESCE(MAX(user_id)+1, 1)
FROM user
WHERE sitecode='SITE001';
Если это имеет смысл ..
Я делал нечто подобное раньше, и он работал нормально, однако центральная база данных в этом случае была никогда работоспособной (это был скорее способ централизованного просмотра / анализа данных), поэтому ей не нужно было генерировать идентификаторы .
EDIT-3:
Я начинаю думать, что было бы проще, если бы централизованная база данных была только когда-либо активной или только для резервного копирования, что позволит полностью избежать этой проблемы и упростить разработку.
Ну что ж, вернемся к чертежной доске!