zoukankan      html  css  js  c++  java
  • 关于truncate与checkident

    今天一个同学在弄一个程序的时候想要初始化所有新建的表,决定使用truncate table xx来进行初始化,但始终报外间约束,初始化失败,奇怪,难道没有将主表关联的

    其他表的记录删除吗,查看后将所有关联的表删除后,重新初始化该表,发现还是报同样了错,这是有点纳闷了,试了下delete xx是可以删除的

    带着疑问网上搜了下,原来有外键关联的表确实不能进行初始化:

    1.由 FOREIGN KEY 约束引用的表。
    2.参与索引视图的表。
    3.通过使用事务复制或合并复制发布的表。

    对于具有以上一个或多个特征的表,使用 DELETE 语句,不能使用truncate,除非先将外键约束暂时去掉。但delete的话,不能将自增的id进行初始化。

    但有时候对自增的id值进行初始化还是有必要的,这是我们就必须使用DBCC CHECKIDENT

    检查指定表的当前标识值,如有必要,还对标识值进行更正。

    语法
    DBCC CHECKIDENT
        ( 'table_name'
            [ , { NORESEED
                    | { RESEED [ , new_reseed_value ] }
                }
            ]
        )


    如果标识列上有主键或唯一键约束,
    使用DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) 当前值设置为new_reseed_value,这个时候需要注意:new_reseed_value 的值应该取当前标识列中的最大值,避免插入错误。

    示例:

    表:

    其中ID是递增的列,现在在查询分析器中运行以下语句将当前标识值改为10,

    USE 数据库名
    GO
    DBCC CHECKIDENT (表名, RESEED, 10)
    GO

    可以发现自增的ID从11开始了,因此我们可以使用这种方式将自增ID进行初始化:

    1.先将该表中的所有记录进行删除

    2.执行

    USE 数据库名
    GO
    DBCC CHECKIDENT (表名, RESEED, 0)
    GO

  • 相关阅读:
    Oracle/PLSQL: RTRIM Function-from cyber
    Oracle/PLSQL: LTRIM Function-from cyber
    Oracle AnyData Data Type Version 11.1-from cyber
    用 Sqlplus 创建用户的详细步骤 (centos 6.0,Oracle 11g)
    SQL_Plus操作命令-引自网络
    Linux下scp的用法-引自网络
    非学习型单层感知机的java实现(日志三)
    N维法向量与N维超平面的关系的简单证明(日志二)
    R语言分析(二)——薛毅R语言第二章后面习题解析
    R语言分析(一)-----基本语法
  • 原文地址:https://www.cnblogs.com/shenliang123/p/2571333.html
Copyright © 2011-2022 走看看