新足迹

 找回密码
 注册

精华好帖回顾

· 美食美刻---重口味第六波--香肠酱肉,香辣排骨干锅,凉拌猪头肉,马兰头香干,三文鱼头豆腐汤,腌笃鲜 (2015-2-16) ta_xiang · 回首又闻她——台北红玫瑰之一 (2008-7-23) 阿Ka
· 初为人母的头三月 (2009-5-23) 飞跑的猪 · 登陆3个月,终于找到工作 (完) (2006-8-7) joaquin
Advertisement
Advertisement
查看: 2672|回复: 34

SQL 大仙 求教 [复制链接]

2010年度奖章获得者

发表于 2010-11-10 14:52 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
为什么 我 Truncate 一个 table 时不行,说有foreign key constraint.

但我 delete 就行呢?

这是怎么个说法?
Advertisement
Advertisement

退役斑竹

发表于 2010-11-10 14:55 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
delete 所有的还是只delete一条或几条记录?

发表于 2010-11-10 14:57 |显示全部楼层
此文章由 holyplague 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 holyplague 所有!转贴必须注明作者、出处和本声明,并保持内容完整
lz太懒了。
DELETE is a logged operation on a per row basis. This means that the deletion of each row gets logged and physically deleted. You can DELETE any row that will not violate a constraint, while leaving the foreign key or any other contraint in place. TRUNCATE is also a logged operation, but in a different way. TRUNCATE logs the deallocation of the data pages in which the data exists. The deallocation of data pages means that your data rows still actually exist in the data pages, but the extents have been marked as empty for reuse. This is what makes TRUNCATE a faster operation to perform over DELETE. You cannot TRUNCATE a table that has any foreign key constraints. You will have to remove the contraints, TRUNCATE the table, and reapply the contraints.

退役斑竹

发表于 2010-11-10 14:57 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
有foreign key constraint的不能用truncate,只能用不带where的delete

2010年度奖章获得者

发表于 2010-11-10 15:01 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 月亮 于 2010-11-10 15:55 发表
delete 所有的还是只delete一条或几条记录?


是 delete 整个table
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

2010年度奖章获得者

发表于 2010-11-10 15:05 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 月亮 于 2010-11-10 15:57 发表
有foreign key constraint的不能用truncate,只能用不带where的delete


我已经把其他所有reference table 全部都truncate 好了。

还是不能truncate 这个table。 只能delete。 doesn't make sense to me!

谁有功夫吧所有的contraint 全部drop 掉,再truncate!

SQL 太变态了,  I hate SQL
足迹 Reader is phenomenal. If you never used, you never lived 火速下载
Advertisement
Advertisement

退役斑竹

发表于 2010-11-10 15:08 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
SQL一直如此变态。。

2010年度奖章获得者

发表于 2010-11-10 15:13 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我发现只要帖子里有 SQL 的keyword, 就一定能把月亮勾搭进来
:)

发表于 2010-11-10 15:21 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-11-10 16:13 发表
我发现只要帖子里有 SQL 的keyword, 就一定能把月亮勾搭进来
:)


同理,你如果想让她喜欢你,你脑门上也要贴个纸条,写着:SQL

这次注意不要写成“hello world”了

评分

参与人数 2积分 +5 收起 理由
deathrow + 2 你太有才了
dalaohu + 3 你太有才了

查看全部评分

头像被屏蔽

禁止发言

发表于 2010-11-10 16:15 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
头像被屏蔽

禁止发言

发表于 2010-11-10 16:16 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-11-10 16:21 发表


同理,你如果想让她喜欢你,你脑门上也要贴个纸条,写着:SQL

这次注意不要写成“hello world”了


Hello SQL World
签名被屏蔽
Advertisement
Advertisement

退役斑竹 2007 年度奖章获得者 2008年度奖章获得者 特殊贡献奖章 参与宝库编辑功臣

发表于 2010-11-10 16:20 |显示全部楼层
此文章由 黑山老妖 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 黑山老妖 所有!转贴必须注明作者、出处和本声明,并保持内容完整
可以临时disable constraint。然后truncate table。完了在enable constraint.

发表于 2010-11-10 16:26 |显示全部楼层
此文章由 bulaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bulaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
I'd just drop it & recreate....because I don't care.

退役斑竹 2007 年度奖章获得者 2008年度奖章获得者 特殊贡献奖章 参与宝库编辑功臣

发表于 2010-11-10 16:34 |显示全部楼层
此文章由 黑山老妖 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 黑山老妖 所有!转贴必须注明作者、出处和本声明,并保持内容完整
I do that too if it's in dev environment...
You will never know how many contraints you will violate if you just drop table...

2010年度奖章获得者

发表于 2010-11-10 17:08 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Is there a SQL command

"Temparily disable all constraint"
And
"Now put all constraint back"?

Otherwise I hv to drop each constraint by their name

特殊贡献奖章

发表于 2010-11-10 18:05 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-11-10 18:08 发表
Is there a SQL command

"Temparily disable all constraint"
And
"Now put all constraint back"?

Otherwise I hv to drop each constraint by their name


sql server里有FOREIGN_KEY_CHECKS 这个值吗?我想应该可以disable所有的constraint的
Advertisement
Advertisement

发表于 2010-11-10 18:15 |显示全部楼层
此文章由 downflyer 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 downflyer 所有!转贴必须注明作者、出处和本声明,并保持内容完整
有其他表包含FK指向这个表的PK,需要把所有这样的FK的constraint都disable,然后truncate这个表,然后enable所有你disable掉的constraint.

发表于 2010-11-10 21:59 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-11-10 18:08 发表
Is there a SQL command

"Temparily disable all constraint"
And
"Now put all constraint back"?

Otherwise I hv to drop each constraint by their name


disable constraint:
ALTER TABLE <table_name> NOCHECK CONSTRAINT <constraint_name>



enable constraint:
ALTER TABLE <table_name> CHECK CONSTRAINT <constraint_name>

2010年度奖章获得者

发表于 2010-11-11 08:00 |显示全部楼层

回复 18# 的帖子

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
If a parent tbl is ref by 100 child tbl.
It would kill me.

seems there's no easier way eh?

发表于 2010-11-11 08:19 |显示全部楼层

回复 19# 的帖子

此文章由 IsDonIsGood 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 IsDonIsGood 所有!转贴必须注明作者、出处和本声明,并保持内容完整
No easy way, Man.
That's SQL~~~

发表于 2010-11-11 08:21 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
先全搞掉
sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
Advertisement
Advertisement

2010年度奖章获得者

发表于 2010-11-11 08:31 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 北风 于 2010-11-11 09:21 发表
先全搞掉
sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"


Wow that look interesting.

I'll give it a shot when I get to office

Thx northwind!
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

发表于 2010-11-11 08:36 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
靠这么迟才去上班爽得很啊

原帖由 dalaohu 于 11/11/2010 08:31 发表


Wow that look interesting.

I'll give it a shot when I get to office

Thx northwind!
If you let people believe that you are weak, sooner or later you’re going to have to kill them.

发表于 2010-11-11 08:46 |显示全部楼层
此文章由 rumcoke 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rumcoke 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我们公司的数据库是不用外键的 完全是控制层决定关系 谁能从实际经验对比一下 这方面一直比较模糊

2010年度奖章获得者

发表于 2010-11-11 08:48 |显示全部楼层

回复 24# 的帖子

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
you gota hv to hv FK constraint, I love FK , it give you peace of mind

2010年度奖章获得者

发表于 2010-11-11 08:49 |显示全部楼层

回复 24# 的帖子

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
and if you using ORM, its heavily rely on FK to build all the class relationships (late execution...etc)
Advertisement
Advertisement

发表于 2010-11-11 10:23 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 dalaohu 于 2010-11-11 09:00 发表
If a parent tbl is ref by 100 child tbl.
It would kill me.

seems there's no easier way eh?


truncate a table is not small thing, u need to take it seriously.

u need to make sure that u REALLY want to disable constraints globally.

if u just play with data, that's fine.

In prod, don't do it.

发表于 2010-11-11 10:25 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 rumcoke 于 2010-11-11 09:46 发表
我们公司的数据库是不用外键的 完全是控制层决定关系 谁能从实际经验对比一下 这方面一直比较模糊


constraints 的用途是帮助你实现data integrity,如果没有这个,你的数据就很有可能不一致,很多烂数据,这是database的大忌。

2010年度奖章获得者

发表于 2010-11-11 10:33 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 北风 于 2010-11-11 09:21 发表
先全搞掉
sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"


牛x啊 北风, 连undocumented sql 你都知道。

可是试了不行。。。 应为这个 NoCHECK constraint. 只是不检查 数据 (child 的 FK 值是不是存在于 Parent 里)。
可是FK Contraint 还是在的。 只要FK还在就还是不能 truncate。

看来没别的办法了, 我只有些个script,先一个个table drop FK, 然后再一个个的放回去了。

感谢诸位大仙解惑了!
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

发表于 2010-11-11 11:26 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
把ref constraint disable就能delete 了啊?
为啥一定要truncate呀

原帖由 dalaohu 于 11/11/2010 10:33 发表


牛x啊 北风, 连undocumented sql 你都知道。

可是试了不行。。。 应为这个 NoCHECK constraint. 只是不检查 数据 (child 的 FK 值是不是存在于 Parent 里)。
可是FK Contraint 还是在的。 只要FK还在就还是不能 trun ...
If you let people believe that you are weak, sooner or later you’re going to have to kill them.

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部