CУБД MS SQL 2008 R2.
Ситуация такая:
Есть таблица Message с двумя внешними ключами SenderUserId и ReceiverUserId для которых первичным ключом является поле UserId таблицы пользователей. Правило на ON DELETE SET NULL — т.е. SenderUserId или ReceiverUserId должны
становиться NULL при удалении связанного с ними пользователя.
Так вот проблема такая: на одно поле такой внешний ключ создается без проблем, при попытке создать такой же внешний ключ на
второе поле, получаю ошибку:
— Не удалось создать связь «FK_Message_aspnet_Users».
Введение ограничения внешнего ключа (FOREIGN KEY) «FK_Message_aspnet_Users» для таблицы «Message»
может привести к появлению циклов или множественных каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION либо измените другие ограничения внешнего ключа (FOREIGN KEY).
Нельзя создать ограничение. См. предыдущие ошибки.
Какие нафик циклы или коскадные пути при SET NULL, учитывая, что сами внешние ключи ни для кого первичными не являются???? — Microsoft, чё юмору от Петросяна учился??
Вопрос: как обойти этот косяк, может какой нибудь фикс есть, т.к. это же
явный косяк СУБД.
(Сразу скажу, что триггер это не вариант)
Вопрос:
Я использую Microsoft SQL Server 2005 и относительно новичок в SQL в целом.
В базе данных “Информация” существует связь между двумя таблицами “Ресурсы” и “Групповые_ресурсы”. Ресурсы имеют внешний ключ, “id”, в Group_Resources с именем “resource_id”. Существует ограничение внешнего ключа, “fk_gr_res_resources”, между двумя.
Я зарегистрирован как владелец базы данных и имею полные права на чтение/запись/создание/удаление.
Я хочу удалить ограничение внешнего ключа, поэтому я выполнил следующий запрос:
ALTER TABLE [Information].[group_resources] DROP CONSTRAINT fk_gr_res_resources
и получил следующую ошибку:
‘fk_gr_res_resources’ не является ограничением. Не удалось отказаться от ограничения. См. Предыдущие ошибки.
Я смущен, потому что это ограничение, и нет орфографических ошибок. Я собираюсь удалить это ненадлежащим образом? Удаляю ли я ограничение из неправильной таблицы? Любые предложения были бы очень благодарны, и, пожалуйста, не плачьте мне: я все-таки новичок в SQL.
Лучший ответ:
Вы получаете эту ошибку:
Msg 3728, Level 16, State 1, Line 1
'fk_gr_res_resources' is not a constraint.
Msg 3727, Level 16, State 0, Line 1
Could not drop constraint. See previous errors.
Поскольку ограничение FK не существует!
Вы уверены, что Information – это правильное имя схемы, а не dbo?
1. Этот SQL докажет, что FK не существует:
SELECT * FROM sysobjects WHERE name = 'fk_gr_res_resources'
2. К сожалению, я ошибся в своем первоначальном ответе, вот правильный синтаксис для SQL Server:
ALTER TABLE <table_name>
DROP CONSTRAINT <foreignkey_name>
3. Пример для вашей базы данных:
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'fk_gr_res_resources')
BEGIN
ALTER TABLE Group_Resources
DROP CONSTRAINT fk_gr_res_resources
END;
4. Попробуйте запустить это:
IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = 'fk_gr_res_resources')
BEGIN
ALTER TABLE Group_Resources
ADD CONSTRAINT fk_gr_res_resources
FOREIGN KEY (resource_id)
REFERENCES Resources(id) /* make sure Resources.id is a PRIMARY KEY */
END;
5. Затем попробуйте это и посмотрите, все ли вы получите эту ошибку:
ALTER TABLE Group_Resources
DROP CONSTRAINT fk_gr_res_resources
Другой синтаксис был для MySQL, извините:
ALTER TABLE <table_name>
DROP FOREIGN KEY <foreignkey_name>
Спасибо за исправление меня OMG Ponies!
I’m trying to drop a constraint on a DB table, something like:
ALTER TABLE MyTable drop CONSTRAINT FK_MyTable_AnotherTable
But the execution just runs and runs. If I stop it I see:
Msg 3727, Level 16, State 0, Line 2
Could not drop constraint. See previous errors.
Web search throws up various pages but note that the constraint is properly named and I am trying to remove it using the correct name
![]()
asked Apr 7, 2010 at 13:53
DannykPowellDannykPowell
1,2275 gold badges18 silver badges30 bronze badges
0
I was having the same issue on SQL Server 2008 R2, I solved my problem with below line hopefully it will work for someone else as well 🙂
Alter Table [Table Name]
DROP Column [Column Name]
answered May 29, 2014 at 8:01
![]()
Zeeshan AjmalZeeshan Ajmal
8801 gold badge16 silver badges29 bronze badges
2
Found a way to sort this, although I don’t understand why it was necessary.
Have been able to drop the constraint by disabling it first:
ALTER MyTable NOCHECK CONSTRAINT FK_MyTable_AnotherTable
The drop then completes fine
Would still welcome any comments on the reason why this is necessary
answered Apr 7, 2010 at 14:54
DannykPowellDannykPowell
1,2275 gold badges18 silver badges30 bronze badges
1
Verify that you’ve not already dropped the constraint, like:
SELECT OBJECT_ID('FK_MyTable_AnotherTable')
If this returns null, your constraint no longer exists. That would explain the error message.
answered Apr 7, 2010 at 13:56
3
I had same problem.
The reason was that I made a mistake in my cursor statement, which was iterating some constraint I was to drop.
So this error occurred when the constraint was actually removed in the same transaction. Then I did a rollback and checked if it existed: it did (of course, after rollback!).
Check if it really exists at the moment of dropping.
answered Dec 2, 2015 at 7:18
flam3flam3
1,7791 gold badge17 silver badges26 bronze badges
I’m trying to drop a constraint on a DB table, something like:
ALTER TABLE MyTable drop CONSTRAINT FK_MyTable_AnotherTable
But the execution just runs and runs. If I stop it I see:
Msg 3727, Level 16, State 0, Line 2
Could not drop constraint. See previous errors.
Web search throws up various pages but note that the constraint is properly named and I am trying to remove it using the correct name
![]()
asked Apr 7, 2010 at 13:53
DannykPowellDannykPowell
1,2275 gold badges18 silver badges30 bronze badges
0
I was having the same issue on SQL Server 2008 R2, I solved my problem with below line hopefully it will work for someone else as well 🙂
Alter Table [Table Name]
DROP Column [Column Name]
answered May 29, 2014 at 8:01
![]()
Zeeshan AjmalZeeshan Ajmal
8801 gold badge16 silver badges29 bronze badges
2
Found a way to sort this, although I don’t understand why it was necessary.
Have been able to drop the constraint by disabling it first:
ALTER MyTable NOCHECK CONSTRAINT FK_MyTable_AnotherTable
The drop then completes fine
Would still welcome any comments on the reason why this is necessary
answered Apr 7, 2010 at 14:54
DannykPowellDannykPowell
1,2275 gold badges18 silver badges30 bronze badges
1
Verify that you’ve not already dropped the constraint, like:
SELECT OBJECT_ID('FK_MyTable_AnotherTable')
If this returns null, your constraint no longer exists. That would explain the error message.
answered Apr 7, 2010 at 13:56
3
I had same problem.
The reason was that I made a mistake in my cursor statement, which was iterating some constraint I was to drop.
So this error occurred when the constraint was actually removed in the same transaction. Then I did a rollback and checked if it existed: it did (of course, after rollback!).
Check if it really exists at the moment of dropping.
answered Dec 2, 2015 at 7:18
flam3flam3
1,7791 gold badge17 silver badges26 bronze badges
Я пытался создать таблицу, имеющую отношения «один ко многим». но кажется, что добавление внешнего ключа в Personal не работает. Я пытаюсь связать таблицу личной информации с таблицей адресов? как решить эту ошибку?
- Таблица
Addressуспешно сохранена Personalтаблица
Невозможно создать связь «FK_Personal_Address».
Каскадный внешний ключ FK_Personal_Address не может быть создан, если ссылающийся столбец Personal.ID является столбцом идентификаторов. Не могла создать ограничение. См. Предыдущие ошибки.
5 ответов
Лучший ответ
Первичный ключ в таблице Person предположительно является идентификатором. Это целочисленное поле с автоинкрементом.
Вам нужно сделать внешний ключ в адресной таблице типа int, а не identity. Он будет содержать целые числа, которые соответствуют записям Person, но вы не хотите, чтобы внешний ключ автоматически увеличивался. Для каждой записи в дочерней таблице (адресе) вы установите конкретное значение для внешнего ключа, указывающее, какой родительской записи (Person) она принадлежит.
Примере:
INSERT person (firstname, lastname) VALUES ('John', 'Smith')
Будет вставлена новая запись о человеке, и поле personid будет заполнено автоматически, поскольку это поле IDENTITY.
Теперь, чтобы вставить адрес Джона Смита, вам нужно знать его personid. Например:
-- Say, for example, personid of John Smith is 55
INSERT address (personid, street, city) VALUES (55, 'High Street', 'London')
Таким образом, в таблице person персональный идентификатор создается автоматически, но в таблице address вы указываете значение, которое соответствует существующему человеку. В этом весь смысл внешнего ключа.
Без дополнительной информации о вашей схеме трудно угадать проблему.
5
njr101
13 Фев 2012 в 19:30
Я убедился, что следую идентификатору, int и первичному ключу, которые обсуждались в ответе выше. Однако я все еще получал ту же ошибку.
'xReason' table saved successfully
'xAddress' table
- Unable to create relationship 'FK_xAddress_xReason'.
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_xAddress_xReason". The conflict occurred in database "databaseName", table "dbo.xReason", column 'xReasonID'.
Эта ошибка устранена, когда я вставил некоторые данные в Reason table. (таблицу с первичным ключом).
Если вы дочитали до этого места, это может быть вашей проблемой.
4
DevelopZen
28 Сен 2015 в 22:30
Не видя структуры таблиц в вопросе, я считаю, что наиболее вероятная причина заключается в том, что столбец в вашей дочерней таблице (Адрес) отмечен как столбец Identity. В отношении внешнего ключа значение поля определяет родитель, а не дочерний элемент. Столбец может быть PK в дочерней таблице, но не идентификатором.
1
Fls’Zen
13 Фев 2012 в 16:37
Похоже, что вы пытаетесь создать внешний ключ на Personal.ID, относящийся к самому себе.
Вероятно, вы захотите сделать что-то вроде:
ALTER TABLE Adress WITH NOCHECK ADD CONSTRAINT [FK_Adress_Personnal] FOREIGN KEY(Personal_Id)
REFERENCES Personal (ID)
1
Kilren
13 Фев 2012 в 16:41
У меня такая же ошибка при добавлении ограничений внешнего ключа в одну из моих таблиц. Я обнаружил, что обходным путем было добавить его с помощью NOCHECK. почему я смог добавить два других внешних ключа с помощью CHECK, но не третий внешний? Я обнаружил, что это была не таблица, а порядок добавления внешнего ключа. Мы будем очень благодарны за любое понимание этого.
-1
user2154869
11 Мар 2013 в 05:33
- Remove From My Forums
UNABLE to ADD or DROP a Constraint — SQL Complains!
-
Question
-
Hi all, I am trying to create a CONSTRAINT but for some reason T-SQL does not allow me to do that.
When I try to DROP a CONSTRAINT it says:
Msg 3728, Level 16, State 1, Line 13
‘DF_TBL_SyncTable_DEVUK‘ is not a constraint.
Msg 3727, Level 16, State 0, Line 13
Could not drop constraint. See previous errors.When I try to ADD a CONSTRAINT it says:
Msg 1781, Level 16, State 1, Line 14
Column already has a DEFAULT bound to it.
Msg 1750, Level 16, State 0, Line 14
Could not create constraint. See previous errors.For some reason I can’t win here. Can’t drop it nor can I create one. Any solution?
Code Snippet
ALTER TABLE TBL_SyncTable DROP CONSTRAINT DF_TBL_SyncTable_DEVUK
ALTER TABLE TBL_SyncTable ADD CONSTRAINT GOD_TBL_SyncTable_DEVUK DEFAULT 2 FOR DEVUK
Thanks for comments + suggestions.*UPDATE*
I am trying to use the following code to check if the SCHEMA exists but still no luck. For some reason when I create it and wrap an IF statement around it, it doesn’t detect the SCHEMA. Is something wrong with my code?
Code Snippet
IF EXISTS(
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = ‘dbo’
AND CONSTRAINT_NAME = ‘DF_TBL_SyncTable_DEVUK’
AND TABLE_NAME = ‘TBL_SyncTable’
)
SELECT * FROM TABLE_1
ELSE
ALTER TABLE TBL_SyncTable ADD CONSTRAINT DF_TBL_SyncTable_DEVUK DEFAULT 2 FOR DEVUK
- Remove From My Forums
UNABLE to ADD or DROP a Constraint — SQL Complains!
-
Question
-
Hi all, I am trying to create a CONSTRAINT but for some reason T-SQL does not allow me to do that.
When I try to DROP a CONSTRAINT it says:
Msg 3728, Level 16, State 1, Line 13
‘DF_TBL_SyncTable_DEVUK‘ is not a constraint.
Msg 3727, Level 16, State 0, Line 13
Could not drop constraint. See previous errors.When I try to ADD a CONSTRAINT it says:
Msg 1781, Level 16, State 1, Line 14
Column already has a DEFAULT bound to it.
Msg 1750, Level 16, State 0, Line 14
Could not create constraint. See previous errors.For some reason I can’t win here. Can’t drop it nor can I create one. Any solution?
Code Snippet
ALTER TABLE TBL_SyncTable DROP CONSTRAINT DF_TBL_SyncTable_DEVUK
ALTER TABLE TBL_SyncTable ADD CONSTRAINT GOD_TBL_SyncTable_DEVUK DEFAULT 2 FOR DEVUK
Thanks for comments + suggestions.*UPDATE*
I am trying to use the following code to check if the SCHEMA exists but still no luck. For some reason when I create it and wrap an IF statement around it, it doesn’t detect the SCHEMA. Is something wrong with my code?
Code Snippet
IF EXISTS(
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = ‘dbo’
AND CONSTRAINT_NAME = ‘DF_TBL_SyncTable_DEVUK’
AND TABLE_NAME = ‘TBL_SyncTable’
)
SELECT * FROM TABLE_1
ELSE
ALTER TABLE TBL_SyncTable ADD CONSTRAINT DF_TBL_SyncTable_DEVUK DEFAULT 2 FOR DEVUK
Hydra. Первый запуск. Работа с БД
22.04.2011
Здравствуйте!
БД создана, пользователь создан (MS SQL 2008 Standard).
При первом запуске Hydra выдаёт сообщение, ключевой (как я считаю) фразой является:
«… Сохранённая процедура «Exchange_Count» не существует.»
Предполагаю, что Гидра сама создаёт все бизнесс-правила на сервере? Какова может быть причина ошибки?
Заранее благодарю за ответ.
1 2 3 > >>
|
Mikhail Sukhov
|
Дата: 22.04.2011
Вы все шаги сделали, которые описаны в документации? |
||||
|
|
|||||
|
sunmoon
|
Дата: 22.04.2011
Проблема решена. Пропустил выполнение скрипта по созданию базы. В документации не чётко прописано, что надо делать. Михаил, спасибо за быстрый ответ. |
||||
|
|||||
|
|
|||||
|
sunmoon
|
Дата: 22.04.2011
После создания БД, и настройки пары инструментов для загрузки, при запуске Гидры появляется данное сообщение: |
||||
|
|||||
|
|
|||||
|
Mikhail Sukhov
|
Дата: 22.04.2011
|
||||
|
|||||
|
|
|||||
|
Sajan
|
Дата: 07.05.2011
После установки при запуске скрипта trading.sql возникла ошибка. Чего делать? Код Сообщение 22002, уровень 16, состояние 1, строка 0 При запуске Hydra возникла ошибка, но привести не могу, т.к. не нашёл, как прикрепить (закачать) картинку. |
||||
|
|||||
|
|
|||||
|
Mikhail Sukhov
|
Дата: 07.05.2011
Sajan После установки при запуске скрипта trading.sql возникла ошибка. Чего делать? Как оказалась, формат моего скрипта не совместим с ms sql 2005. Или писать свой, или использовать 2008. |
||||
|
|||||
|
|
|||||
|
Sajan
|
Дата: 07.05.2011
А как прикреплять картинки к посту? У меня Гидра всё-равно ругается, а как скрины показать, не знаю:) Код (0 row(s) affected) |
||||
|
|||||
|
|
|||||
|
Mikhail Sukhov
|
Дата: 07.05.2011
Sajan А как прикреплять картинки к посту? У меня Гидра всё-равно ругается, а как скрины показать, не знаю:) Код (0 row(s) affected) Ctrl+C на окно. |
||||
|
|||||
|
|
|||||
|
Sajan
|
Дата: 09.05.2011
Код ————————— в System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) в System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnection owningObject) в System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) в System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) в System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) в System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) в System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) в System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) в System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) в System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) в System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) в System.Data.SqlClient.SqlConnection.Open() в Ecng.Data.DatabaseProvider.CreateConnection(String connectionString) в Ecng.Data.Database.CreateConnection() в Ecng.Data.Database.<>c__DisplayClass7.<GetCommand>b__6(Query ) в Ecng.Collections.CollectionHelper.SafeAdd[TKey,TValue](IDictionary`2 dictionary, TKey key, Func`2 handler) в Ecng.Data.Database.GetCommand(Query commandQuery, SerializationItemCollection source) в Ecng.Data.HierarchicalDatabase.GetCommand(Schema schema, SqlCommandTypes type, FieldCollection keyFields, FieldCollection valueFields, SerializationItemCollection source) в Ecng.Data.Database.GetCount(Schema schema) в Ecng.Data.Database.GetCount[TEntity]() в Ecng.Serialization.RelationManyList`1.OnGetCount() в Ecng.Data.HierarchicalPageLoadList`1.OnGetCount() в Ecng.Serialization.RelationManyList`1.ReadAll(Int64 startIndex, Int64 count, Field orderBy, SortDirection direction) в Ecng.Serialization.RelationManyList`1.GetRange(Int64 startIndex, Int64 count, String sortExpression, SortDirection directions) в Ecng.Collections.BaseListEx`1.GetRange(Int64 startIndex, Int64 count) в Ecng.Serialization.RelationManyList`1.get_Count() в Ecng.Trading.Hydra.MainWindow..ctor() в E:StockSharpReleasesStockSharp_3.0.19SourcesHydraHydraMainWindow.xaml.cs:строка 43 |
||||
|
|||||
|
|
|||||
|
Mikhail Sukhov
|
Дата: 10.05.2011
Что-то не так с БД. Подпробуйте к ней подключиться через Management Studio, указав логин и пароль Гидры. |
||||
|
|||||
1 2 3 > >>