将表创建从MSSQL转换为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]

基于以前的MSSQL创建脚本,等效的PostgreSQL表创建脚本会是什么样子?正在寻找一种方法/资源,可以指导我将MSSQL模式转换为PostgreSQL。。。

Phil的回答是正确的。正如您所要求的">方法",这里有一个非常简短的描述来转换Microsoft T-SQL:

  • 总是以;结束您的语句(通常:用;替换GO)-不,;不会位于公共表表达式的with关键字前面
  • 删除非标准方括号"引用"[..](我强烈建议永远不要使用引用的标识符)。有关标识符语法的详细信息,请参阅手册
  • 标识列映射到Postgres中的serialbigserial。这意味着数据类型为integerbigint,因此您只需要关键字serial。有关详细信息,请参阅手册
  • Postgres中没有CCD_ 12。所有字符列都使用相同的字符集
  • 要转换的其他数据类型(不完整!):

    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
    
  • 没有聚集索引,因此删除clustered属性

  • 整个with部分定义了在Postgres中不相关的表的物理属性
  • CCD_ 15模式"映射"到Postgres中的CCD_。不过,public的前缀表并不常见,除非您更改了架构搜索路径(也不需要为自己的函数使用架构前缀,因为它在SQL Server中是必需的)

需要注意的一些事项:

  • 字符串比较在Postgres中区分大小写。CCD_ 18将返回与CCD_ 19不同的内容。搜索这个网站,有很多关于这方面的问题
  • SQL Server的LIKE(例如like '[0-9]')的"穷人的正则表达式"语法在Postgres中不起作用。您需要使用正则表达式运算符
  • 日期处理有点不同
  • Postgres对正确的数据类型和值文本更加挑剔。where varchar_column = 2在Postgres中失败,即使该列中只有数字
  • 在Postgres中,您可以将多个null值插入到一个可为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); 
    

此列表并不完整从一个DBMS转换到另一个DBMS时,需要注意的还有很多。

开始:

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
);

SQL Fiddle:http://sqlfiddle.com/#!15/b76b6

最新更新