Как удалить еще один первичный ключ в sql?

Я пытаюсь удалить все первичные ключи из одной таблицы на SQL. Если бы у меня был один первичный ключ, я бы удалил эту строку кода:

ALTER TABLE dbo.TblName DROP CONSTRAINT PK_TblName;

Но если у меня есть еще один первичный ключ, я ошибаюсь:

Msg 3728, Level 16, State 1, Line 18 'PK_TblBooks' is not a constraint. Msg 3727, Level 16, State 0, Line 18 Could not drop constraint. See previous errors.

И я пробую это на C#, но они не удаляются:

String sql= "SELECT COL_NAME(ic.object_id,ic.column_id) AS ColumnName FROM sys.indexes AS i INNER JOIN sys.index_columns AS ic ON i.object_id = ic.object_id WHERE i.is_primary_key = 1 AND ic.object_id = i.object_id";
SqlCommand cmd= new SqlCommand(sql, con);
SqlDataAdapter adp= new SqlDataAdapter(cmd);
DataTable dtsk = new DataTable();
adp.Fill(dtsk);

for (int i = 0; i < dtsk.Rows.Count; i++)
{
String remove= "ALTER TABLE " + Table + " DROP CONSTRAINT PK_" + Table + "";
SqlCommand cmd1= new SqlCommand(remove, con);
SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
}

Как можно посмотреть, как решить эту проблему?

Дважды проверьте имя ограничения, возможно, вы просто неправильно его ввели. Или вы выполняете одну и ту же инструкцию более одного раза? У каждого ограничения есть собственное уникальное имя. В приведенном выше заявлении имя этого ограничения - PK_TblName.

Igor 10.08.2018 15:21

@ Игорь Это имя, я хочу удалить все первичные ключи в имени таблицы.

user9914768 10.08.2018 15:24
It's name i wanna deleted all primary keys in table name <= Я не понимаю, что вы имеете в виду (извините). Для всех ограничений таблицы нет оператора удаления. Запустите 1 оператор перетаскивания на ограничение, используя имя ограничения.
Igor 10.08.2018 15:27

К вашему сведению, в таблице может быть только один основной.

fancyPants 10.08.2018 15:35

Пожалуйста, покажите нам, что вы видите, что заставляет вас думать, что в вашей таблице PK_TblBooks есть первичный ключ с именем name. Вы неправильно это истолковываете, что бы это ни было.

Tab Alleman 10.08.2018 15:57

@TabAlleman - это первичные ключи ID и BooksID.

user9914768 10.08.2018 16:04

@Callout Это не на 100% ясно, но если оба эти поля определены как поля первичного ключа в одной и той же таблице, тогда нет одного первичного ключа, состоящего из нескольких столбцы - иначе называемых составным первичным ключом. В одной таблице может быть только один первичный ключ. Но в любом случае сообщение об ошибке не об этом ... похоже, вы пытаетесь удалить то, чего не существует.

ADyson 10.08.2018 16:12

@Callout, который не показывает нам, это говорит нам. Разместите скриншот или я вам не верю.

Tab Alleman 10.08.2018 19:21
1
8
343
1

Ответы 1

Попробуйте с помощью dynamic sql удалить pk какой-нибудь таблицы.

declare @sql nvarchar(max) = '';
with CTE as (
  select T1.*,T2.name tableName from sys.key_constraints T1
  left join sys.objects T2 on T1.parent_object_id = T2.object_id
  where T2.name = 'T' --your table name
)
select @sql = concat(@sql,'ALTER table ',tableName,' DROP CONSTRAINT ',name,';')
from CTE;

exec(@sql); --delete T table all pk 

select * from sys.key_constraints; --result:null

ТЕСТОВЫЙ DDL:

CREATE TABLE T
    ([col1] varchar(2), [col2] varchar(2)
       ,constraint PK_TblName unique (col1)
       ,constraint PK_TblName2 unique (col1)
    )
;

онлайн-демонстрация

Другие вопросы по теме