将表创建从MSSQL转换为PostgreSQL

cul*_*oly 1 sql sql-server postgresql

CREATE TABLE [dbo].[Addresses](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [UserId] [int] NULL,
    [City] [nvarchar](50) NULL,
    [State] [nvarchar](50) NULL,
    [CountryCode] [nvarchar](50) NULL,
    [PostalCode] [nvarchar](50) NULL,
    [Street1] [nvarchar](50) NULL,
    [Street2] [nvarchar](50) NULL,
PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

基于以前的MSSQL创建脚本,等效的PostgreSQL表创建脚本会是什么样子?寻找可以指导我将MSSQL架构转换为PostgreSQL的方法/资源...

a_h*_*ame 16

菲尔的回答是正确的.正如您还要求" for a approach ",这里有一个非常简短的描述来转换Microsoft T-SQL:

  • 最后总是你的陈述与;(一般:更换GO;) -不,该;不会没有在前面走with的关键字为一个共同的表表达式
  • 删除非标准方括号"引用" [..](我强烈建议永远不要使用带引号的标识符).有关标识符语法的详细信息,请参见手册
  • 标识列映射到Postgres serialbigserial在Postgres中.这意味着数据类型integer或者bigint所以你只需要关键字serial.有关详细信息,请参阅手册
  • nvarcharPostgres 没有.所有字符列都使用相同的字符集.
  • 要转换的其他数据类型(不完整!):

    SQL Server         Postgres
    ---------------------------
    image              bytea
    binary             bytea
    varbinary(max)     bytea
    varchar(max)       text
    nvarchar(max)      text
    text               text
    ntext              text
    bit                boolean
    datetime           timestamp
    smalldatetime      timestamp
    timestamp          no equivalent
    uniqueidentifier   uuid 
    xml                xml
    
    Run Code Online (Sandbox Code Playgroud)
  • 没有聚簇索引,因此删除该clustered属性

  • 整个with部分定义了与Postgres无关的表的物理属性
  • dbo模式"映射"到public了在Postgres架构.public除非您更改了架构搜索路径,否则它有点不常见的前缀表(也不需要为SQL Server中需要的函数使用架构前缀)

有些事需要注意:

  • 字符串比较在Postgres中区分大小写.where name = 'Arthur'将返回不同的东西where name = 'arthur'.搜索这个网站,有很多关于此的问题.
  • SQL Server的LIKE(例如like '[0-9]')的"穷人的正则表达式"语法在Postgres中不起作用.您需要使用正则表达式运算符.
  • 日期处理有点不同
  • Postgres对正确的数据类型和价值文字更加挑剔.where varchar_column = 2即使该列中只有数字,Postgres也会失败
  • 在Postgres中,您可以null在可空列上的唯一索引中插入多个值.以下在SQL Server中失败但在Postgres中有效

    create table foo (col1 integer, col2 integer);
    create unique index idx_foo on foo (col1, col2);
    insert into foo (col1, col2) values (1, null);
    insert into foo (col1, col2) values (1, null); 
    
    Run Code Online (Sandbox Code Playgroud)

这个清单绝不完整!从一个DBMS转换到另一个DBMS时,还有很多要注意的事项.


Phi*_*ton 6

干得好:

CREATE TABLE Addresses(
    Id SERIAL NOT NULL PRIMARY KEY,
    UserId int NULL,
    City varchar(50) NULL,
    State varchar(50) NULL,
    CountryCode varchar(50) NULL,
    PostalCode varchar(50) NULL,
    Street1 varchar(50) NULL,
    Street2 varchar(50) NULL
);
Run Code Online (Sandbox Code Playgroud)

SQL小提琴:http://sqlfiddle.com/#!15/b76b6