>

88bifa必发唯一官网自动生成,timestamp数据类使用

- 编辑:www.bifa688.com -

88bifa必发唯一官网自动生成,timestamp数据类使用

 

您可能感兴趣的稿子:

  • MySQL timestamp的门类与时区实例详解
  • mysql之TIMESTAMP(时间戳)用法详解
  • MySQL错误TIMESTAMP column with CURRENT_TIMESTAMP的缓和措施
  • MySQL timestamp自动更新时间享受
  • mysql From_unixtime及UNIX_TIMESTAMP及DATE_FOCRUISERMAT日期函数
  • SQL总计timestamp的差值的点子

 

复制代码 代码如下:

 

@@DBTS(SELECT @@DBTS)
为最近数据库再次来到当前 timestamp 数据类型的值。那一 timestamp 值保障在数据库中是不二法门的。
语法
@@DBTS
再次来到类型
varbinary
注释
@@DBTS

一 数据类型调换

    数据类型转变表详见下表,这一个数据类型的改换近来已测试过,均可不奇怪使用。

    然则注意两类数据仓库储存储数据的部分出入,看下能或不能够接受:

  • SQL SERAV4VEGL450中的datetime,保留到飞秒(秒后小数点三个人),而mysql仅保留到秒,调换后是还是不是会潜移默化工作,假若影响,要求新增加二个字段特意来存款和储蓄微秒或然纳秒,纵然mysql中尚无时间数据类型的精度达到飞秒也许皮秒,不过mysql提供对阿秒的相关管理函数microsecond、extract跟date_format。
  • MySQL使用tinyint代替SQL SERVER的bit
  • SQL SE陆风X8VE奥德赛的money类型使用decimal替代
  • timestamp的调换,SQL SEPAJEROVE牧马人中是1个1陆进制的数字,代表时间戳,每一遍修改都会数值都会变大。
    • 从成效怀念,调换为mysql的时候,管理为timestamp的数据类型,暗许值为CU宝马X5RENT_TIMESTAMP,行发生修改则定期修改那壹列数据,倘若那样转换,那么在SQL SE途乐VECRUISER导入数据的时候,将要相应管理。(本文存储进度暗中同意这么管理)
    • 从数根据考证虑,转变为mysql的时候,处理为bigint的数据类型(修改存款和储蓄进程case when b.name = 'timestamp' then ' timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ' 为case when b.name = 'timestamp' then ' bigint ' )
  • 自增管理,mysql的自增步长跟增量值是漫天实例统1的,不能够各种表格动态修改,所以这边在转化的历程中,为auto_increment,依据实例的安装来拍卖

 

ID SQL SERVER MySQL Description
1 bigint bigint  
2 binary binary  
3 bit tinyint SQL SERVER的bit类型,对于零,识别为False,非零值识别为True。
MySQL中没有指定的bool类型,一般都使用tinyint来代替
4 char char  
5 date date  
6 datetime datetime 注意,mssql的保留到微秒(秒后小数点3位),而mysql仅保留到秒
7 datetime2 datetime 注意,mssql的保留到微秒(秒后小数点7位),而mysql仅保留到秒
8 datetimeoffset datetime 注意,mssql的保留时区,这个需要程序自己转换
mssql的保留到微秒(秒后小数点7位),而mysql仅保留到秒
9 decimal decimal  
10 float float  
11 int int  
12 money float 默认转换为decimal(19,4)
13 nchar char SQL SERVER转MySQL按正常字节数转就可以
14 ntext text  
15 numeric decimal  
16 nvarchar varchar  
17 real float  
18 smalldatetime datetime  
19 smallint smallint  
20 smallmoney float 默认转换为decimal(10,4)
21 text text  
22 time time 注意,mssql的保留到秒后小数点8位,而mysql仅保留到秒
23 timestamp timestamp 注意,mssql的行时间戳,处理为mysql的 timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 。这会对后面导数据造成影响,从功能方面来看,可以按照上文转换;如果从数据来看,若需要转换16进制的文字存储到mysql中,则这里设置为bigint即可,在表格中的临时表中设置。
24 tinyint tinyint  
25 uniqueidentifier varchar(40) 对应mysql的UUID(),设置为文本类型即可。
26 varbinary varbinary  
27 varchar varchar  
28 xml text mysql不支持xml,修改为text

 

在SQL Server中联机丛书是那样说的:
SQL Server timestamp 数据类型与时间和日期无关。SQL Server timestamp 是贰进制数字,它申明数据库中数量修改爆发的对峙顺序。达成 timestamp 数据类型最初是为着援助 SQL Server 恢复生机算法。每一回修改页时,都会采取当前的 @@DBTS 值对其做三回标志,然后 @@DBTS 加一。那样做能够支持恢复生机进度鲜明页修改的相对次序,然则 timestamp 值与时光尚未别的涉及。
作者用口水话解释一下便于驾驭:
大家知晓数字类型有个“标记”属性,设置好“标记种子”、“标志递增量”,每增添一条记下时,这些字段的值就能够在近年的一个标志值基础上电动扩大,这样大家能够清楚哪些记录是先增加的,哪些记录是后增加的,可是大家鞭长莫及知道怎么着记录修改过。timestamp这些类其他字段呢,每扩展一条记下时,它会在近期的3个小时戳基础上机关增添,当修改某条记下时,它也会在近期的3个时刻戳基础上自行增添,所以大家就了然哪些记录修改过了。


回到当前数据库最后所使用的年华戳值。当带有 timestamp 列的一行被插入或更新时,会爆发3个新的年月戳值。

    建表的SQL中,首要在数据类型转换、主键及索引的拍卖。

Microsoft SQL Server 用三个 四 字节的整数内部存款和储蓄 datetime 数据类型的值。第三个 四 字节存款和储蓄 base date(即 一九〇三 年 一 月 二三日)此前或以后的天命。基础日期是系统参谋日期。不容许早于 1753 年 一 月 10日的 datetime 值。其余多少个 肆字节存款和储蓄以早晨后纳秒数所代表的每一日的时间。

    SQL SEMuranoVELX570的表结构及索引转换为MySQL的表结构及索引,其实在数不尽第3方工具中有提供,举个例子navicat、sqlyog等,可是,在拍卖有些数据类型、暗中同意值及索引转变的时候,总某个救经引足并且必要设置软件,懒人开首主见子,所以基于SQL SERAV4VERAV4,写了二个仓库储存进程,能够依赖表名间接转变为MySQL的建表建索引的SQL脚本(针对 MySQL Innodb引擎)。近期不帮助分区表的分区配置及区域数据类型的调换。

timestamp 这种数据类型表现自动生成的二进制数,确定保障这个数在数据库中是不今不古的。timestamp 一般作为给表行加版本戳的体制。存款和储蓄大小为 8 字节。
注释
Transact-SQL timestamp 数据类型与在 SQL-9二 标准中定义的 timestamp 数据类型不一样。SQL-玖2 timestamp 数据类型等价于 Transact-SQL datetime 数据类型。
Microsoft® SQL Server™ 今后的本子恐怕会修改 Transact-SQL timestamp 数据类型的作为,使它与在标准中定义的行事等同。到当下,当前的 timestamp 数据类型将用 rowversion 数据类型替换。
Microsoft® SQL Server™ 两千 引进了 timestamp 数据类型的 rowversion 同义词。在 DDL 语句中尽量使用 rowversion 而不利用 timestamp。rowversion 受数据类型同义词行为的钳制。有关愈多音讯,请参见数据类型同义词。
在 CREATE TABLE 或 ALTER TABLE 语句中,不必为 timestamp 数据类型提供列名:
CREATE TABLE ExampleTable (PriKey int P凯雷德IMA本田CR-VY KEY, timestamp)假若未有提供列名,SQL Server 将转换 timestamp 的列名。rowversion 数据类型同义词不有所如此的作为。钦赐 rowversion 时必须提供列名。
多个表只好有3个 timestamp 列。每便插入或更新包涵 timestamp 列的行时,timestamp 列中的值均会更新。那1属性使 timestamp 列不适协作为键使用,特别是不可能作为主键使用。对行的其余更新都会改造timestamp 值,从而改换键值。借使该列属于主键,那么旧的键值将船到江心补漏迟,进而引用该旧值的外键也将不再灵光。如若该表在动态游标中援引,则装有更新均会变动游标中央银行的岗位。假使该列属于索引键,则对数据行的兼具更新还将导致索引更新。
不可为空的 timestamp 列在语义上等价于 binary(捌) 列。可为空的 timestamp 列在语义上等价于 varbinary(8) 列。

 

    尽管转发,请注解博文来源: www.cnblogs.com/xinysu/   ,版权归 搜狐 苏家小萝卜 全数。望各位扶助!

三 索引增添

    由于聚焦索引已处理增添为主键,在建表的SQL中已决断,这里则只处理非聚焦索引。

    管理进程中注意:

  • MySQL不扶助INCLUDE选项的隐含索引,所以在处理的进程中,INCLUDE列增多到索引列中
  • MySQL 不帮忙WHERE选项的过滤索引,所以在管理的长河中,WHERE选项去除
  • 目录名字管理:包蕴列一-三个的,直接IX_表名,当先3个列的,取每列前二个字符,整个索引名长度不超过陆拾叁个字符,超越截取前63个字符

 

伍 存款和储蓄进度脚本

    SQL SEXC90VE昂科威转换MySQL表结构及索引的本子如下:

 

-- =============================================
-- Author: suxinyu
-- Create date: 20170612
-- Description: 根据表名自动把表格的所有建表DDL SQL转化为 MySQL的建表SQL,不包含分区表,不处理区域数据类型;执行过程中,需要把存储过程建立在需要导出的数据库中。
-- Example: exec p_tb_mssqltomysql 'orders,ordernums,channels'
-- =============================================
--存储过程建立在需要导出表结构的DB上

USE db
GO


CREATE  PROC [dbo].[p_tb_mssqltomysql] 
@tbsql varchar(1000)
AS
SET NOCOUNT ON ;

--处理tablename的字符串,把tablename字符串分割成每一行存储进入表变量中
DECLARE @tab_tablename table(tbname varchar(100))
DECLARE @tbname varchar(100)
INSERT INTO @tab_tablename(tbname)
SELECT

      SUBSTRING(@tbsql,NUMBER,CHARINDEX(',',@tbsql ',',NUMBER)-number)
FROM master.dbo.spt_values
WHERE TYPE='P'  AND number>0 AND SUBSTRING(',' @tbsql,number,1)=','

--把mysql跟mssql的数据类型对应起来存储
--空间数据类型不处理
--money类型处理为float
--timestamp处理为 timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
DECLARE @tbtype table(mssql varchar(20),mysql varchar(20))
INSERT INTO @tbtype(mssql,mysql) values( 'bigint','bigint'),('binary','binary'),('binary','binary'),('bit','tinyint'),('char','char'),('date','date'),('datetime','datetime'),('datetime2','datetime'),('datetimeoffset','datetime'),('decimal','decimal'),('float','float'),('int','int'),('money','decimal'),('nchar','char'),('ntext','text'),('numeric','decimal'),('nvarchar','varchar'),('real','float'),('smalldatetime','datetime'),('smallint','smallint'),('smallmoney','decimal'),('text','text'),('time','time'),('timestamp','timestamp'),('tinyint','tinyint'),('uniqueidentifier','varchar(40)'),('varbinary','varbinary'),('varchar','varchar'),('xml','text')

DECLARE @tb_exec_sql table(tbname varchar(100),sql nvarchar(max),indexs nvarchar(max))
DECLARE @indexs_sql nvarchar(max) 

--转化表格SQL
DECLARE NAME CURSOR FOR

SELECT tbname FROM @tab_tablename
OPEN NAME
FETCH NEXT FROM name INTO @tbname
WHILE @@FETCH_STATUS =0
BEGIN
     ;WITH data AS (
     SELECT 
           case when b.is_unique=1 then ' UNIQUE ' else ' ' end is_unique,
           OBJECT_NAME(A.OBJECT_ID) obj_name,
           COL_NAME(A.object_id,A.column_id) colname,
           SUBSTRING(COL_NAME(A.object_id,A.column_id),1,3) col_short,
           is_included_column,
           index_column_id,
           a.index_id,
           A.OBJECT_ID
     FROM SYS.index_columns A INNER JOIN SYS.INDEXES B ON A.OBJECT_ID=B.OBJECT_ID AND A.index_id=B.index_id
     WHERE b.type!=1 and OBJECT_NAME(A.OBJECT_ID)=@tbname
     )
     SELECT 
           @indexs_sql=
           REPLACE(
                      (STUFF(
                              (
                               SELECT 
                                      ' CREATE '
                                           a.is_unique
                                          ' INDEX '
                                           CASE WHEN COUNT(*) >=3 THEN SUBSTRING(('IX_' stuff((SELECT '_' col_short FROM data b where a.object_id=b.object_id and a.index_id=b.index_id FOR XML PATH('')),1,1,'')),1,64)
                                              ELSE 'IX_' stuff((SELECT '_' colname FROM data b where a.object_id=b.object_id and a.index_id=b.index_id FOR XML PATH('')),1,1,'')
                                           END
                                          ' ON '
                                           a.obj_name
                                          '( '
                                           stuff((SELECT ',' colname FROM data b where a.object_id=b.object_id and a.index_id=b.index_id FOR XML PATH('')),1,1,'')
                                          ' );
                                         '
                                FROM data a 
                                GROUP BY a.is_unique,a.obj_name,a.object_id,a.index_id
                                ORDER BY a.object_id,a.index_id 
                                FOR XML PATH('')

                               ),1,1,'')
                      ),'
','')


      INSERT INTO @tb_exec_sql(tbname,indexs,sql)
      SELECT
            @tbname,@indexs_sql,
            'CREATE TABLE ' @tbname '(' 
             REPLACE(
                   STUFF( (
                               SELECT
                                     ',' a.name
                                     
                                    case when b.name = 'timestamp' then ' timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP '
                                         when b.name = 'uniqueidentifier' then ' varchar(40) '
                                         when b.name in ('char','nchar','nvarchar','varbinary','varchar') then ( case when a.length<0 then ' text ' else ' ' c.mysql '('  (case when b.name like 'n%' then cast(a.length/2 as varchar(10)) else cast(a.length as varchar(10)) end ) ')'  end )
                                         when b.name in ('decimal','float','money','numeric','smallmoney') then ' ' c.mysql '('  cast(a.prec as varchar(10))  ','  cast(a.scale as varchar(10))  ') '
                                         else ' ' c.mysql ' ' end
                                     
                                    case when a.isnullable=0 then ' not null ' else ' null ' end
                                     
                                    case when COLUMNPROPERTY( A.ID,A.NAME,'ISIDENTITY')=1 then ' auto_increment ' else '' end
                                     
                                    case when a.length<0 or b.name in ('text') then ' '
                                         when e.text like ' ((%' then ' default ' substring(e.text,3,len(e.text)-4)
                                         when e.text like ' (''%' then ' default ' substring(e.text,2,len(e.text)-2)
                                         else ' '
                                    end
                                     
                                    ISNULL(' comment "' cast(g.value as varchar(1000)) '"
                                                     ','
                                                     ')

                               FROM sys.syscolumns A
                               LEFT JOIN sys.systypes B ON A.XUSERTYPE=B.XUSERTYPE
                               LEFT JOIN @tbtype C ON b.name collate Chinese_PRC_CI_AS  = c.mssql
                               LEFT JOIN sys.sysobjects D ON A.ID=D.ID AND D.XTYPE='U' AND D.NAME<>'DTPROPERTIES'
                               LEFT JOIN sys.syscomments E ON A.CDEFAULT=E.ID
                               LEFT JOIN sys.extended_properties G ON A.ID=G.major_id AND A.COLID=G.minor_id
                               WHERE D.NAME =@tbname
                               order by a.colid
                               FOR XML PATH('')
                              ),1,1,'')
                        ,'&#x0D;','')
              
             ISNULL(

                 ( SELECT

                                ', primary key (' STUFF(
                                                              (
                                                                                     SELECT

                                                                ',' col_name(i.object_id,ik.column_id)
                                                         FROM sys.indexes i
                                                         JOIN sys.index_columns ik ON i.index_id=ik.index_id and i.object_id=ik.object_id
                                                         WHERE i.type=1 and i.object_id=object_id(@tbname)
                                                         ORDER BY key_ordinal
                                                         FOR XML PATH('')
                                                       ),1,1,'')

                                                                 ') '
                     )
                       ,'')
              
          ')'
           
          ISNULL( (
                   SELECT
                                  ' COMMENT "' CAST(value AS VARCHAR(1000)) '";
                             '

                         FROM sys.extended_properties

                           where major_id=object_id(@tbname) and minor_id=0
                         ),';')

          FETCH NEXT FROM NAME INTO @tbname
END
CLOSE NAME
DEALLOCATE NAME


SELECT * FROM @tb_exec_sql

 

 

贰 主键管理

    MySQL不帮衬非主键的集中索引,也正是集中索引则是主键。故在改动的历程中,主键是依附SQL SE奥迪Q三VE卡宴表格中的聚焦索引来转变的。

 

--SQL SERVER根据聚集索引的列情况来创建mysql的主键
SELECT
       col_name(i.object_id,ik.column_id) pk_col
FROM sys.indexes i
JOIN sys.index_columns ik ON i.index_id=ik.index_id and i.object_id=ik.object_id
WHERE i.type=1
      and i.object_id=object_id('tb')
ORDER BY key_ordinal

 88bifa必发唯一官网 1

4 测试

    存款和储蓄进程 [p_tb_mssqltomysql] 仅含一个参数 @tbsql,用于存款和储蓄表格名字,三个表格名高中级有逗号隔开分离,不要有空格恐怕别的标识。

    88bifa必发唯一官网 2

    这里,尝试创造三个新表来测试。  

    创制表格及对应索引新闻测试如下:

 1 CREATE TABLE tbtest(
 2 id INT IDENTITY(1,1) NOT NULL ,
 3 name NVARCHAR(50) NOT NULL,
 4 phone VARCHAR(11) NOT NULL,
 5 age int default 99 ,
 6 birthday datetime default getdate(),
 7 addresss text,
 8 monyes money default 123456789012345.1234,
 9 smonyes smallmoney,
10 nums int default 2,
11 moneys money,
12 smo smallmoney,
13 curversion timestamp
14 )
15  
16 ALTER TABLE tbtest ADD CONSTRAINT PK_tbtest PRIMARY KEY (ID,phone);
17 CREATE INDEX IX_NAME ON tbtest(NAME);
18 CREATE INDEX IX_phone_age ON tbtest(phone,age);
19 CREATE INDEX IX_nums ON tbtest(nums) WHERE nums>2;
20 CREATE INDEX IX_birthday ON tbtest(birthday) include (name,phone);

 

    实践存款和储蓄进度转化:

 

 1 exec p_tb_mssqltomysql 'tbtest'
 2  
 3  
 4 CREATE TABLE tbtest(id int  not null  auto_increment 
 5 ,name varchar(50) not null 
 6 ,phone varchar(11) not null 
 7 ,age int  null 
 8 ,birthday datetime  null 
 9 ,addresss text  null 
10 ,monyes decimal(19,4)  null 
11 ,smonyes decimal(10,4)  null 
12 ,nums int  null 
13 ,moneys decimal(19,4)  null 
14 ,smo decimal(10,4)  null 
15 ,curversion timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  not null 
16 , primary key (id,phone) );   
17 CREATE   INDEX IX_name ON tbtest( name );
18 CREATE   INDEX IX_phone_age ON tbtest( phone,age );
19 CREATE   INDEX IX_nums ON tbtest( nums );
20 CREATE   INDEX IX_bir_nam_pho ON tbtest( birthday,name,phone );

 

    在mysql中开创正常,查看mysql的建表脚本如下:

 

 88bifa必发唯一官网 3



本文由88bifa必发唯一官网发布,转载请注明来源:88bifa必发唯一官网自动生成,timestamp数据类使用