将表创建从MSSQL转换为PostgreSQL

时间:2015-04-24 04:49:51

标签: 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]

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

2 个答案:

答案 0 :(得分:15)

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

  • 始终使用;结束语句(一般情况下:将GO替换为;) - 不,; 转到公共表表达式的with关键字前面
  • 删除非标准方括号“引用”[..](我强烈建议从不使用带引号的标识符)。有关标识符语法are in the manual
  • 的详细信息
  • 标识列映射到Postgres中的serialbigserial。这意味着数据类型为integerbigint,因此您只需要关键字serial。有关详细信息see the manual
  • Postgres中没有nvarchar。所有字符列都使用相同的字符集。
  • 要转换的其他数据类型(不完整!):

    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
  • 无关的表的物理属性
  • dbo架构“映射”到Postgres中的public架构。除非您更改了架构搜索路径(也不需要为SQL Server中需要的自己的函数使用架构前缀),但public有一些不常见的前缀表。

需要注意的一些事项:

  • 字符串比较在Postgres中是敏感where name = 'Arthur'将返回与where name = 'arthur'不同的内容。搜索这个网站,有很多关于此的问题。
  • SQL Server的LIKE(例如like '[0-9]')的“穷人的正则表达式”语法在Postgres中不起作用。您需要使用正则表达式运算符。
  • 日期处理is a bit different
  • 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); 
    

此列表并不完整!从一个DBMS转换到另一个DBMS时,需要注意更多批次

答案 1 :(得分:6)

你走了:

module Queue where
data Queue a = Q[a] deriving Show

class QDS q a where
  pop :: q a -> (a, q a)
  push :: q a -> a -> q a
  lengthQS :: q a -> Int
  isEmpty :: q a -> Bool

instance QDS Queue a where
  pop (Q (x:xs)) = (x, (Q xs))
  push (Q x) a = (Q (x ++ [a])) 
  lengthQS (Q x) = length x
  isEmpty q = lengthQS q == 0  -- This line fails

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