将表格创建从MSSQL转换到PostgreSQL

3
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...


https://wiki.postgresql.org/wiki/Microsoft_SQL_Server_to_PostgreSQL_Migration_by_Ian_Harding - undefined
2个回答

18

Phil的回答是正确的。由于您还要求“for an approach”,这里有一个非常简短的描述,用于转换Microsoft T-SQL:

  • 始终使用 ; 结尾语句(通常:用 ; 替换 GO) - 不,; 不应该放在公共表达式中 with 关键字前面
  • 移除非标准方括号引用符号 [..] (我强烈建议永远不要使用带引号的标识符)。关于标识符语法的详细信息请参见手册
  • 自增列在Postgres中映射到 serialbigserial。这意味着数据类型为 integerbigint,因此您只需要使用关键字 serial。有关详细信息,请参见手册
  • 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 模式。虽然将表以 public 为前缀有些不太常见,除非您更改了模式搜索路径(在 SQL Server 中自己的函数也无需使用模式前缀,但在 Postgres 中则需要)
  • 注意事项:

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

    这个列表绝对不是完整的! 在从一个数据库管理系统转换到另一个时,还有很多需要注意的地方。


    如果你喜欢这个SQL Server架构,你可以创建一个名为"dbo"的模式。 - undefined
    1
    只需重新登录到此帐户,并且 @vivek 是正确的;这真是太好了。感谢详细说明和反馈。现在我对继续进行迁移更有信心了。只是现在担心我的 "serial" 列中可能存在间隔,因为适用的 MSSQL 表中可能已经删除了一些条目,它们现在可能无法映射到其他表中的外键 :/ ... 猜想这将需要手动操作,对吗?你知道在迁移过程中保持引用完整性的方法吗?除了手动更新外键列之外? - undefined
    @culturalanomoly: 只需将现有的值导入到您的Postgres数据库中,然后调整序列以匹配当前的最大值(使用setval('sequence_name'))。不用担心间隔空缺的问题。 - user330315
    @a_horse_with_no_name 再次感谢!如果可以的话,我会给你小费的... 你有类似于 gittip 的账户吗? - undefined
    这里可以找到一个稍微更完整的类型映射列表:http://www.sqlines.com/sql-server-to-postgresql - undefined

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

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


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接