Konvertieren Sie Tabellenerstellung von MSSQL zu 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] 

Was würde das äquivalente PostgreSQL Tabellenerstellungs-Skript aussehen, basierend auf dem vorherigen MSSQL erstellen Skript? Auf der search nach einem Ansatz / einer Ressource, die mich bei der Umwandlung von MSSQL-Schema in PostgreSQL …

Phil's Antwort ist richtig. Wie Sie auch nach " für einen Ansatz " gefragt haben, ist hier eine sehr kurze Beschreibung, um Microsoft T-SQL zu konvertieren:

  • immer beenden Sie Ihre Aussagen mit einem ; (im Allgemeinen: Ersetzen Sie GO mit ; ) – und nein, die ; geht nicht vor dem with Schlüsselwort für einen gemeinsamen Tabellenausdruck
  • entfernen Sie die nicht standardmäßige quadratische Klammer "zitieren" [..] (ich empfehle, niemals benannte Bezeichner zu verwenden). Details zur Identifikations-Syntax finden Sie im Handbuch
  • Identitätsspalten zur serial oder bigserial in Postgres. Das bedeutet, dass der datatyp integer oder bigint so dass Sie nur das Keyword serial benötigen. Details siehe Handbuch
  • es gibt kein nvarchar in nvarchar . Alle characterspalten verwenden denselben charactersatz.
  • andere datatypen zu konvertieren (unvollständig!):

     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 
  • Es gibt keine gruppierten Indizes, also entfernen Sie das clustered Attribut

  • Das Ganze with Teil definiert die physikalischen properties der Tabelle, die in Postgres nicht relevant sind
  • das dbo schema "kartiert" zum public schema in postgres. Es ist etwas ungewöhnliche Präfix-Tabellen mit der public sei denn, Sie haben Ihren Schemasuchpfad geändert (es gibt auch keine Notwendigkeit, das Schema-Präfix für Ihre eigenen functionen zu verwenden, wie es in SQL server erforderlich ist)

Einige Dinge zu beachten:

  • String-Vergleich ist Groß- / Kleinschreibung in Postgres. where name = 'Arthur' wird etwas anderes zurückgeben als where name = 'arthur' . searchn Sie diese Seite, es gibt viele Fragen dazu.
  • die "arme Mannes Regex" -Syntax von SQL server's LIKE (zB like '[0-9]' ) funktioniert nicht in Postgres. Du musst den Regex-Operator benutzen.
  • datesabwicklung ist ein bisschen anders
  • Postgres ist viel wählerisch über korrekte datatypen und Wertliterale. where varchar_column = 2 in Postgres fehlschlägt, auch wenn es nur Zahlen in dieser Spalte gibt
  • In Postgres können Sie mehrere null in einen eindeutigen Index in einer nullable Spalte insert. Das folgende fehlschlägt in SQL server, aber funktioniert in 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); 

Diese list ist keineswegs vollständig! Es gibt viel mehr zu sehen bei der Umwandlung von einem DBMS zu einem anderen.

Bitte schön:

 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-Geige: http://sqlfiddle.com/#!15/b76b6