С математической точки зрения, учитывая, что таблица имеет не более одного первичного ключа, кажется близоруким дизайнерским решением ссылаться на первичные ключи по некоторому произвольному имени вместо простого свойства таблицы.
Как следствие, чтобы изменить первичный ключ с некластерного на кластерный или наоборот, вы должны сначала найти его имя, затем отбросить его и, наконец, прочитать его.
Есть ли какое-то преимущество в использовании произвольных имен, которых я не вижу, или же СУБД не использует произвольные имена для первичных ключей?
Изменить 2011-02-22 (22.02.2011 для тех, кто не хочет сортировать там дату):
Позвольте мне показать функцию, с помощью которой вы можете получить имена первичного ключа из имени его таблицы (используя ранние системные таблицы sql-sever или sybase):
create function dbo.get_pk (@tablename sysname)
returns sysname
as
begin
return (select k.name
from sysobjects o
join sysobjects k on k.parent_obj = o.id
where o.name = @tablename
and o.type = 'U'
and k.type = 'k')
end
go
Как утверждает gbn, никому не понравится сгенерированное имя, если вы не предоставите явное имя:
create table example_table (
id int primary key
)
select dbo.get_pk('example_table')
Я только что получил
PK__example___3213E83F527E2E1D
Но почему имена в sysobjects должны быть уникальными. Было бы прекрасно использовать одно и то же имя для таблицы и ее первичного ключа.
Делая это таким образом, нам не нужно было устанавливать соглашения об именах, которые могут быть случайно нарушены.
Теперь ответы Мариан:
- Я использовал только задачу преобразования кластерного первичного ключа в некластеризованный в качестве примера, где мне нужно знать фактическое имя ПК, чтобы иметь возможность его отбросить.
- Вещи не должны иметь собственных имен, достаточно, чтобы их можно было однозначно обозначить. Это основа абстракции. Объектно-ориентированное программирование идет по этому пути. Вам не нужно использовать разные имена для похожих свойств разных классов.
- Это произвольно, потому что это свойство таблицы. Имя таблицы - это все, что вам нужно знать, если вы хотите ее использовать.