![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Свойство IDENTITY [D7, MSSQL]
Patrick © (2004-04-14 11:36:00)Добрый день! Вопрос таков : есть у меня таблица FUELS, в ней 2 поля FuelCode (tinyint) и FuelName (char(10)), у поля FuelCode стоит свойство IDENTITY, проблема состоит в том, что добавляя новую запись INSERT INTO FUELS (FUELNAME) VALUES ('Новое значение'), вылезает ошибка по поводу дублирования ключа, хотя в других таблицах, где вроде бы все также всё в норме.
bushmen (2004-04-16 14:38:00) [1]>Patrick © (16.04.04 14:09) [49]
На УАЗе :)
paul_k (2004-04-16 14:22:00) [2]кстати если вместо
DELETE FROM NSI.dbo.Fuels
DBCC CHECKIDENT('NSI.dbo.Fuels', RESEED, 0);
написать просто
truncate table NSI.dbo.Fuels
будеи эффект тот-же а исполнение быстрее
sniknik (2004-04-16 14:19:00) [3]ну наконец то подробно, но опоздал...
Patrick (2004-04-16 14:09:00) [4]Обязательно, где встречаемся для совместного пития?
bushmen (2004-04-16 13:35:00) [5]>Patrick ©
С тебя по ящику пива для каждого за напрасное беспокойство! :)))
Patrick (2004-04-16 13:27:00) [6]ВСЕМ ПАРДОН ЗА БЕСПОКОЙСТВО и НАПРЯГ. ОШИБКА ОКАЗАЛАСЬ БОЛЕЕ ЧЕМ БАНАЛЬНОЙ - ЗАБЫЛ BEGIN ... END ПОСТАВИТЬ, ЕЩЕ РАЗ ВСЕМ SORRY.
paul_k (2004-04-16 12:47:00) [7]А каков тайный смысл строки
> DBCC CHECKIDENT('NSI.dbo.Fuels', RESEED, 0);
если её коментаришь все работает.
This example forces the current identity value in the jobs table to a value of 30.
USE pubs
GO
DBCC CHECKIDENT (jobs, RESEED, 30)
GO
то есть после выполнения твоей строки у тебя следующий ID обязан быть 1. вот тебе и ннарушение ключа
Patrick (2004-04-16 12:17:00) [8]Да нет, моя цель - именно решить проблему, а про хранимую не говорил т.к. там всё прозрачно (наверное), текст создания таблицы и хранимой процедуры привожу ниже, уж не знаю куда пробнее.
CREATE TABLE [dbo].[Fuels] (
[FuelCode] [tinyint] IDENTITY (1, 1) NOT NULL ,
[FuelName] [char] (10) COLLATE Cyrillic_General_CI_AS NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Fuels] WITH NOCHECK ADD
CONSTRAINT [PK_Fuels] PRIMARY KEY CLUSTERED
(
[FuelCode]
) ON [PRIMARY]
GO
и хранимая
CREATE PROCEDURE dbo.FuelAction
@Option smallint,
@pFuelCode tinyint,
@pFuelName char(5)
AS
BEGIN
IF @Option = 0
SELECT f.FuelCode, f.FuelName
FROM NSI.dbo.Fuels f
BEGIN TRANSACTION
IF @Option = 1
UPDATE NSI.dbo.Fuels
SET FuelName = @pFuelName
WHERE FuelCode = @pFuelCode
IF @Option = 2
INSERT INTO NSI.dbo.Fuels (FuelName)
VALUES (@pFuelName)
IF @Option = 3
IF EXISTS(SELECT * FROM NSI.dbo.Marks WHERE FuelCode = @pFuelCode)
RAISERROR ( 'Удаление невозможно. Данный тип топлива есть в справочнике моделей.', 16, 127)
ELSE
DELETE FROM NSI.dbo.Fuels
WHERE FuelCode = @pFuelCode
IF @Option = 4
DELETE FROM NSI.dbo.Fuels
DBCC CHECKIDENT('NSI.dbo.Fuels', RESEED, 0);
COMMIT TRANSACTION
END
GO
bushmen (2004-04-16 10:46:00) [9]>3 сервис пак затыкает дырку от вируса, в основном
Он еще много чего делает. В том числе и калечит некоторые вещи :)
sniknik (2004-04-16 10:42:00) [10]ну во первых это не подробное описание.
а во вторых совмещая описание [39] с [42] понял так, что ты делаеш все возможное чтобы запутать MSSQL и нас заодно. (про процедуру сказал только в 42м посте, это как? у тебя цель какая, решить чтото или на судьбу и била пожаловаться? )
извини но проверять это уже ломает (так и не понял последовательность, и в результате уверен на 99.8%, не будет глюка).
кстати смысл программирования не в том чтобы найти глюк в чужом продукте а в написании своего безглючного, даже если приходится обходить дыры разработчика (которых немного кстати говоря и это не из их числа).
> А вот SP3 там нет, может подскажите где его можно нарыть в Инете.
3 сервис пак затыкает дырку от вируса, в основном. раскопками можно занятся на сайте производителя продукта.
Patrick (2004-04-16 08:28:00) [11]Добрый день!
Вчера ответить не удалось, Инет у нас срубили, пробовал и таблицу "убивать" и хранимую процедуру (в которой делаю инсерт)естественно тоже, ничего не помогает, ну а подробное описание таково, ну создаю табличку заново. указываю первичный ключ только по полю тиниинт и ставлю идентити по этому полю, далее создаю процедуру, в ней по входным опциям операции для этой таблицы (SELECT,UPDATE,INSERT,DELETE). Ну и потом выполняю эту процедуру для инсерта один раз - нормально, возможно и второй раз нормально, но далее - идет дублирование. Меня заинтересовало предложение по поводу SP3 посмотрел на диске, там отдельно от установки сервака есть SP1 и SP2, а также какие-то Security Hotfix Update (3шт.) различных версий (откровенно не знаю что это такое) и не помню ставили мы их или нет. А вот SP3 там нет, может подскажите где его можно нарыть в Инете.
sniknik (2004-04-15 15:46:00) [12]непонятен конечно смысл этого убирания/установки но проверил как написано, убрал сохранил опять поставил, работает (почти не сомневался) и после 5 инсертов ключь не дублируется (и для инт и для тиниинт).
может конечно у тебя F2 ключом является...
распиши подробно как получить ошибку (по шагам). а то неполучается нифига.
bushmen (2004-04-15 15:41:00) [13]>а у другой таблички - "структура почти такая же" - всё хорошо
А если таблицу "убить" и заново создать - глюк повторяется? А у тебя sp3 на SQL Server стоит?
Patrick (2004-04-15 15:07:00) [14]Добрый день! В продолжение вчерашней дисскурсии, наметился один момент, оказывается клиентская часть нипричем, т.к. экспериментирую чисто в Manager'е убираю свойство IDENTITY, сохраняю, заново ставлю это свойство, добавляю запись - работает,
INSERT INTO T1(F2) VALUES ('Новая строка'), в таблице 2 поля F1-integer (IDENTITY (1,1)) и F2 - char(20), добавляю еще запись - сообщение "дублирование ключа", опять изменяю свойство - картина повторяется, а у другой таблички - "структура почти такая же" - всё хорошо, может всё таки кто подскажет, в чем может быть дело?
что еще можно проверить, такое подозрение, что со счетчиком что-то неладное, таблица достаточно простая - никаких триггеров нет.
Fay (2004-04-14 19:35:00) [15]2sniknik © (14.04.04 19:24) [37]
В случае с IDENTITY - это пофинг. Даже для tinyint 8)
А вот
Server: Msg 8115, Level 16, State 1, Line 6
Arithmetic overflow error converting IDENTITY to data type tinyint.
Arithmetic overflow occurred.
- это запросто.
sniknik (2004-04-14 19:24:00) [16]> поэтому хоть из 878 полей...
особенно с tinyint у которого 255 максимум. ;)
Fay (2004-04-14 19:06:00) [17]2paul_k © (14.04.04 19:02) [35]
>> 1. а ключ не составной ли из нескольких полей?
1. Так, конечно, бывает. Но identity - уже возможный ключ, поэтому хоть из 878 полей...
2. см. 3
3. см. 1
paul_k (2004-04-14 19:02:00) [18]1. а ключ не составной ли из нескольких полей?
2. см. 1
Fay (2004-04-14 16:46:00) [19]Проверь - что в ключе.
Проверь триггеры.
Ega23 (2004-04-14 15:55:00) [20]Что-то здесь не так... В самом деле, чудес не бывает.
Попробуй чётко проперти таблицы посмотреть.