是否禁用和启用SQL Server支持的外键约束?或者是我唯一的选择drop,然后重新create约束?
使用MSSQL2005,如果我先截断子表(具有FK关系主键的表),是否可以截断具有外键约束的表?
我知道我也可以
DELETE不带where子句然后RESEED使用身份(或)我认为只要我在父母之前截断子表,我就可以不用上面的任何一个选项,但是我收到了这个错误:
无法截断表'TableName',因为它正被FOREIGN KEY约束引用.
我有一组InnoDB表,我经常需要通过删除一些行并插入其他行来维护.其中一些表具有引用其他表的外键约束,因此这意味着表加载顺序很重要.要插入新行而不必担心表的顺序,我使用:
SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)
之前,然后:
SET FOREIGN_KEY_CHECKS=1;
Run Code Online (Sandbox Code Playgroud)
后.
加载完成后,我想检查更新表中的数据是否仍然保持参照完整性 - 新行不会破坏外键约束 - 但似乎没有办法做到这一点.
作为测试,我输入的数据确实违反了外键约束,并且在重新启用外键检查时,mysql没有产生任何警告或错误.
如果我试图找到一种方法来指定表加载顺序,并在加载过程中留在了外键检查,这不会让我在具有自引用外键约束的表加载数据,因此这将不是一个可接受的解决方案
有没有办法强制InnoDB验证表或数据库的外键约束?
在我的网站上,我使用的是MySQL数据库.我正在使用webservice,在那里我做所有与数据库相关的操作.
现在,在该Web服务的一种方法中,我得到以下错误.
选择命令被拒绝用户''''为表'''
可能有什么不对?
下面是我得到该错误的代码.我试过调试,发现它在线路上失败了
MySqlDataReader result1 = command1.ExecuteReader();
这是我的代码:
String addSQL = "Select Max(`TradeID`) from `jsontest`.`tbl_Positions";
MySqlConnection objMyCon = new MySqlConnection(strProvider);
objMyCon.Open();
MySqlCommand command = objMyCon.CreateCommand();
command.CommandText = addSQL;
MySqlDataReader result = command.ExecuteReader();
//int j = command.ExecuteNonQuery();
while (result.Read())
{
MaxTradeID = Convert.ToInt32(result[0]);
}
objMyCon.Close();
for (i = 1; i <= MaxTradeID; i++)
{
String newSQL = "Select `Strike`,`LongShort`,`Current`,`TPLevel`,`SLLevel` from `json`.`tbl_Position` where `TradeID` = '" + i + "'";
MySqlConnection objMyCon1 = new MySqlConnection(strProvider);
objMyCon1.Open();
MySqlCommand command1 = objMyCon1.CreateCommand(); …Run Code Online (Sandbox Code Playgroud) 我正在使用带有ruby的datamapper将数据存储到某些表中.
有几个表有非常大量的信息,我想在用户"重建数据库"时清除它们(它基本上删除了所有内容并重新计算数据).
我最初尝试使用Forum.all.destroy并为所有不同的表做了它,但我注意到其中一些只是没有从phpmyadmin中删除.我只能想象它因为外键.虽然我真的不知道,因为我的其他表格已成功删除.更不用说,无论如何,它只是'零',所以键不会达到非常大的数字(如#500,000键).
然后我尝试使用下面的代码运行它,但由于"外键约束",它没有清除表格.我想强迫它工作,因为我知道一个事实我正在清理所有相互依赖的表(我只是没有清除2个表,一个设置表和一个随机存储表,两者都没有使用外键).
到目前为止我有......
adapter = DataMapper.repository(:default).adapter
adapter.execute('TRUNCATE TABLE `forums`, `dates`, `remarks`');
Run Code Online (Sandbox Code Playgroud)
这很好,除了mysql语法显然是错误的.所以这是第一件事
我在phpmyadmin中逐一做到这一点,当我这样做的时候,它说
Cannot truncate a table referenced in a foreign key constraint
Run Code Online (Sandbox Code Playgroud) 我正在尝试运行迁移(见下文)并为数据库播种,但是当我运行时
php artisan migrate --seed
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Migration table created successfully.
Migrated: 2015_06_17_100000_create_users_table
Migrated: 2015_06_17_200000_create_password_resets_table
Migrated: 2015_06_17_300000_create_vehicles_table
[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table
referenced in a foreign key constraint (`app`.`vehicles`, CONSTRAINT `vehic
les_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `app`.`users` (`id`
)) (SQL: truncate `users`)
[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table
referenced in a foreign key constraint (`app`.`vehicles`, CONSTRAINT `vehic
les_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `app`.`users` (`id`
))
Run Code Online (Sandbox Code Playgroud)
我查看了这个错误应该是什么意思,并且还找到了遇到同样问题的其他人的 …
我正在整理一个表格,用于向某些信息请求发送后续消息。向一组人发送请求并跟踪响应。如果一个人未能回应,则可能会发送零个或多个跟进。我创建了一个表:
FollowupId int primary key,
RequestId int foreign key (outside this example),
Follows int foreign key (FollowupId),
Message varchar
Run Code Online (Sandbox Code Playgroud)
如果一条消息是第一条跟进消息,Follows 将为空。否则,它是其他一些 Followup 的 id。我还在 Follows 上添加了一个独特的约束。也就是说,在任何给定消息之后不能有超过一条消息。
编辑:我还应该突出显示 Follows 上的外键。它引用此表中的 FollowupId。所以如果A->B->C,仅仅删除B会使C中的外键无效。同样,不可能只更新 C 以跟随 A,因为 B 已经跟随 A 并且唯一约束禁止重复。
当然,问题是,如果该消息后面是另一个消息,则删除后续条目现在很困难。在我看来,应该可以禁用约束检查,从而可以删除中间的后续内容,“向上移动”后续后续内容,然后重新启用检查。是否有某种方法可以仅在事务期间禁用约束?
(此外,我知道在此表中包含 RequestId 可能会导致数据不一致。最好有 Followups [FollowupId, Message]、InitialFollowups [FollowupId, RequestId] 和 followingFollowups [FollowupId, Follows] 表。我认为它不必要地使这个例子复杂化。)
我是一个非常初衷的关系,所以这可能听起来很愚蠢.但是,在截断表和删除所有记录之间(在MySQL中)有什么区别(这个答案仅说明性能)?
我正在玩(在phpMyAdmin中)我的一个测试表,要检查,如何重置auto_increment表的值并运行到情境,我能够删除所有记录:
DELETE from managers;
Run Code Online (Sandbox Code Playgroud)
但是当我试图截断这个表(TRUNCATE managers)时,我得到了警告:Cannot truncate a table referenced in a foreign key constraint (probes, CONSTRAINT probes_ibfk_4 FOREIGN KEY (manager_id) REFERENCES managers (id));.
我必须用"重置" auto_increment值ALTER TABLE managers AUTO_INCREMENT = 1;.
这不奇怪吗?到目前为止,我想,那TRUNCATE= DELETE from managers(在检查和效果方面,因为性能可能不同,但这不是关键).
如何弹出约束警告TRUNCATE而不是"全部删除"?
mysql ×6
foreign-keys ×3
sql-server ×3
constraints ×2
t-sql ×2
truncate ×2
datamapper ×1
innodb ×1
laravel ×1
laravel-5 ×1
phpmyadmin ×1
ruby ×1
sql-delete ×1