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中的
serial
或bigserial
。这意味着数据类型为integer
或bigint
,因此您只需要关键字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