powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / А вот - как отличить PRIMARY KEY от UNIQUE KEY в sysconstraints ? (версия 6.5)
3 сообщений из 3, страница 1 из 1
А вот - как отличить PRIMARY KEY от UNIQUE KEY в sysconstraints ? (версия 6.5)
    #32014620
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала - цитата из BOL...

sysconstraints (T-SQL)
Contains mappings of constraints to the objects that own the constraints. This table is stored in each database.

Column name Data type Description:
constid int - Constraint number.
id int - ID of the table that owns the constraint.
colid - smallint ID of the column on which the constraint is defined, 0 if a table constraint.
spare1 - tinyint Reserved.
status int -
1 = PRIMARY KEY constraint
2 = UNIQUE KEY constraint
3 = FOREIGN KEY constraint
4 = CHECK constraint
5 = DEFAULT constraint
16 = Column-level constraint
32 = Table-level constraint
actions int - Reserved.
error int - Reserved.


Теперь - 2 запросца и результаты их выполнения:

USE pubs

select * from sysconstraints
where
id in (select id from sysobjects where type = 'u' and name = 'authors')

select status
from sysconstraints
group by status

constid id colid spare1 status actions error
----------- ----------- ----- ------ ----------- ----------- -----------
32003145 16003088 0 0 2561 4096 0
48003202 16003088 1 0 133140 4096 0
64003259 16003088 4 0 133141 4096 0
80003316 16003088 8 0 133140 4096 0

(4 row(s) affected)

status
-----------
2068
2561
2593
3089
133139
133140
133141
133633

(8 row(s) affected)


Ну и где же - правда?
Как же их отличать-то "по-правильному"?
...
Рейтинг: 0 / 0
А вот - как отличить PRIMARY KEY от UNIQUE KEY в sysconstraints ? (версия 6.5)
    #32014623
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Берешь status и побитово его проверяешь.
если status & 1 = 1, то это primary key
если status & 2 = 2, то это unique
если status & 3 = 3, то это foreign key
и т.д.
...
Рейтинг: 0 / 0
А вот - как отличить PRIMARY KEY от UNIQUE KEY в sysconstraints ? (версия 6.5)
    #32014662
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 GreenSunrise:

\nБерешь status и побитово его проверяешь.
если status & 1 = 1, то это primary key
если status & 2 = 2, то это unique
если status & 3 = 3, то это foreign key


Кое-какое "зерно" тут, конечно же, есть... НО...
Берешь status = 133139 (таких значений в БД pubs - ажно 10 штук)
и побитово - получаешь:

declare @status int
select @status = 133139
select
@status,
@status & 1 as '1',
@status & 2 as '2',
@status & 3 as '3'
_______________________________________________
status 1 2 3
----------- ----------- ----------- -----------
133139 1 2 3

(1 row(s) affected)


Вроде как - один и тот же тип constraint'а - одновременно тебе: и "primary key", и "unique key", и "foreign key"...


На самом деле, это - обыкновенный "foreign key" (по названиям проверяется, и по полю type на связанной sysobjects).
К счастью, для нахождения правильного решения (см. ниже) - достаточно было посмотреть на "внутренности" системной процедурки sp_helpconstraint...
К сожалению, вчера в конце р/д - не было на это времени, и пришлось запостить сюда вопросик - надеясь на "авось кто-нить знает?".

А решение - вот оно:
(жаль - не было "unique key"-ев в базке pubs, пришлось добавлять "для чистоты эсперимента")

USE pubs
ALTER TABLE dbo.authors ADD CONSTRAINT au_unique_fullname UNIQUE NONCLUSTERED (au_fname, au_lname)
select
count(c.status) as quantity,
o.type,
c.status,
c.status & 15 as ConstType
from sysconstraints c, sysobjects o
where c.constid = o.id
group by o.type, c.status
order by o.type, c.status
______________________________________________
quantity type status ConstType
----------- ---- ----------- -----------
1 C 2068 4
5 C 133140 4
9 D 133141 5
10 F 133139 3
7 K 2561 1
2 K 2593 1
1 K 3089 1
1 K 3106 2
1 K 133633 1

(9 row(s) affected)


Удачи!!!
(спасибо за "наводку")
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / А вот - как отличить PRIMARY KEY от UNIQUE KEY в sysconstraints ? (версия 6.5)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]