Ламерский вопрос по SQL
При этом поле Guid должно быть PK. А поле Id должно быть уникально, но так чтобы при вызове команды insert его можно было задать явно (то есть Identity не годится).Наверное, ты имеешь в виду, наоборот, чтобы можно было _не_ задавать поле Id при Insert-е?
Нет. Надо, чтобы база поддерживала уникальность этого поля, но так, чтобы его можно было задавать явно при инсерте. А если запись с таким Id уже есть, то при попытке вставить выдается ошибка.
поле Guidя так понял речь идет о MSSQL Server-е. Там это называется индекс с юник констрейном.
Надо, чтобы база поддерживала уникальность этого поля, но так, чтобы его можно было задавать явно при инсерте. А если запись с таким Id уже есть, то при попытке вставить выдается ошибка.Ну и в чём тогда проблема? GUID делаешь PK c автоинкрементом, Id - обычным полем с Unique constraint
create procedure insert_client
@Id bigint,
@Name nvarchar(100
@Guid uniqueidentifier OUTPUT
as
insert into clients (Id, Name) values (@Id, @Name)
— PK Guid сгенерился базой
— Как здесь вернуть в параметр @Guid значение, которое сгенерила БД не делая селект?
ты знаешь о существовании google?Что-то слышал... А вообще интернета у меня нету.
@@IDENTITY
Нет, Scope_identity и @@Identity возвращают последнее автоприсвоенное значение для полей с признаком identity типа число, а мне надо для поля типа uniqueidentifier. В общем не катит.
а еще есть INSERT OUTPUT в 2005 SQL Server, мб его можно использовать, я не пробовал
яхз, как это в твоей СУБД, но в mysql есть last_insert_id в постгресе last_oid, ещё в постгресе ты можешь просто сделать селект по sequence-у без for update, навряд ли это будет сильно дольше, чем таким способом.
mysql есть last_insert_id в постгресе last_oidони делают то же, что и @@IDENTITY.
Я думаю, что-то вроде такого должно помочь:
SET @Guid = (INSERT INTO Clients (Id,Name) VALUES (@id, @name) OUTPUT INSERTED.Guid)
CREATE PROCEDURE insert_client
@Guid uniqueidentifier OUTPUT,
@Id bigint,
@Name nvarchar(200)
AS
DECLARE @new_guid table (Guid uniqueidentifier);
INSERT INTO Clients (Id, Name) OUTPUT Inserted.Guid INTO @new_guid VALUES (@Id, @Name);
SET @Guid = (SELECT Guid FROM @new_guid)
Это конечно всяко лучше, чем делать селект из самой таблицы clients. Но все равно мне непонятно, зачем обязательно нужно, чтобы после слова INTO была табличная переменная, а не скалярная (иначе ошибку выдает). Приходится создавать временную таблицу и делать из нее селект...
там получается есть 2 типа: автоинкремент и uniqueidentifier?
оба генерят next id
оба уникальны
а в чем тогда их различие?
там получается есть 2 типа: автоинкремент и uniqueidentifier?автоинкремент — это не тип, а свойство числового поля.
оба генерят next id
оба уникальны
а в чем тогда их различие?
uniqueidentifier — это тип, уникальный идентификатор вида '28de0f5d-4c88-4f38-aa88-c46f8100f658' (128 бит).
один типа целое, а другой типа GUID - а так никакой разницы )
Это конечно всяко лучше, чем делать селект из самой таблицы clients.Можешь объяснить почему?
Можешь объяснить почему?А это не очевидно?
PK Guid сгенерился базойкстати, как это сделано в креат тейбле указано дефолт?
CREATE TABLE ... DEFAULT NewSequentialID
кстати, как это сделано в креат тейбле указано дефолт?Да DEFAULT NEWID
А это не очевидно?нет
Может быть я ошибаюсь, но мне кажется, что селект из таблицы, которая живет не в файле базы данных, а в оперативной памяти, да к тому же содержит не десятки тысяч, а только одну строчку, должен делаться в разы быстрее.
с OUTPUT будет быстрее, но для разовых операций не критично, а для пакетных как раз с OUTPUT в таблице накапливать и возвращать потом удобно
Ясно. К тому же OUTPUT выглядит более универсально, т.к. его применение не зависит от наличия в таблице вторичных ключей таких как Id.
Оставить комментарий
valkira
Друзья, помогите плиз. Нужно создать таблицу, у которой есть колонка Guid типа uniqueidentifier и колонка Id типа bigint. При этом поле Guid должно быть PK. А поле Id должно быть уникально, но так чтобы при вызове команды insert его можно было задать явно (то есть Identity не годится). Если же запись с таким Id уже имеется, генерится ошибка. Как лучше всего это сделать? Только триггером или еще как-то можно? Заранее спасибо.