从不同 table 导入 Postgres

Postgres Import from different table

我对 postgres 还是很陌生。我有一个名为 table 的 university_table 字段:名称, 国籍,缩写,形容词,人。

我发现这个 sql 查询插入数据来自: 下面的查询片段。 如何更改查询以将这些值插入我的 university_country table -- 创建并加载国籍 Table - 英语

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Nationality]') AND type in (N'U'))
DROP TABLE [dbo].[Nationality]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-------------------------------------------------------------------
-- TABLE: [dbo].[Nationality]
-- Creation Date: 02/12/2014
-- Created by: Dan Flynn, Sr. DBA
--
-------------------------------------------------------------------


CREATE TABLE [dbo].[Nationality]
            (
                [NationalityID] [int] IDENTITY(1,1) NOT NULL,
                [Country] [nvarchar](50) NULL,
                [Abbreviation] [nvarchar](5) NULL,
                [Adjective] [nvarchar] (130) NULL,
                [Person] [nvarchar] (60) NULL
            ) ON [PRIMARY]

GO
-------------------------------------------------------------------------------
-- INSERT VALUES
-------------------------------------------------------------------------------

INSERT INTO [dbo].[Nationality](Country, Abbreviation, Adjective, Person )
VALUES  ( 'AMERICAN - USA','US','US (used attributively only, as in US aggression but not He is US)','a US citizen' ),
        ( 'ARGENTINA','AR','Argentinian','an Argentinian' ),
        ( 'AUSTRALIA','AU','Australian','an Australian' ),
        ( 'BAHAMAS','BS','Bahamian','a Bahamian' ),
        ( 'BELGIUM','BE','Belgian','a Belgian' ),



GO


-------------------------------------------------------------------------------
-- ADD CLUSTERED INDEX
-------------------------------------------------------------------------------
CREATE CLUSTERED INDEX [idxNationality] ON [dbo].[Nationality] 
(
    [NationalityID] ASC,
    [Country] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

GO

EXEC sys.sp_addextendedproperty @name=N'TableDiscription', @value=N'CreatedBy: Dan Flynn, Sr. SQL Server DBA
CreationDate: 02/12/2014

Nationality table contains five columns, i.e.:

1. NationalityID, 2. Country, 3. Abbreviation, 4. Adjective, 5. Person

IDs 1 to 34 are alphabetical countries that are statistically the most popular as far as interaction with the United States.  IDs 35 to 248 are also alphabetical for the rest of the countries.

' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Nationality'

GO

有一个 SQL 标准,但没有人完全执行它。一些数据库系统如 PostgreSQL 更善于遵守标准,而其他如 Microsoft SQL Server 则不然。

这样做的结果是,您不能将适用于一个 RDBMS 的 SQL 用于另一个 RDBMS。您必须将其翻译成 PostgreSQL 方言。

要将 T-SQL 转换为与 Postres 的 SQL 方言兼容,您可以使用以下步骤。

  1. 删除所有方括号(它们在 SQL 标识符中是非法的)。如果您的标识符需要使用双引号 ",但我强烈建议您完全避免使用引号引起来的标识符(因此切勿在 SQL 中使用 "
  2. 删除所有 GO 语句并以 ; 结束语句(对于 SQL 服务器也是 that is recommended
  3. 如果您没有在 Postgres 中创建模式前缀(通常不会),请删除 [dbo]. 模式前缀
  4. 删除 Postgres 中不需要的 ON [Primary] 选项(等效于定义一个 table 空间,但在 Postgres 中几乎不需要)
  5. SQL(或 Postgres)中没有 IF,有条件地删除 table 使用 DROP TABLE IF EXISTS ...
  6. Postgres 中没有聚簇索引,因此只需将其设为常规索引并删除 WITH 关键字引入的所有选项即可。
  7. table 上的注释是通过 comment on 定义的,而不是通过调用存储过程
  8. identity(x,y)需要换成标准的SQLgenerated always as identity
  9. 没有 nvarchar 类型,只需将所有内容设为 varchar 并确保您的数据库是使用可以存储多字节字符的编码创建的(默认情况下它是 UTF-8,因此应该没问题)
  10. 不需要,但是:强烈建议使用 snake_case 标识符,而不是 Postgres
  11. 中的 CamelCase

将所有脚本放在一起应该是这样的:

DROP TABLE IF EXISTS Nationality CASCADE;

CREATE TABLE nationality
(
    Nationality_id int generated always as IDENTITY NOT NULL,
    Country varchar(50) NULL,
    Abbreviation varchar(5) NULL,
    Adjective varchar (130) NULL,
    Person varchar (60) NULL
);

INSERT INTO Nationality (Country, Abbreviation, Adjective, Person )
VALUES  ( 'AMERICAN - USA','US','US (used attributively only, as in US aggression but not He is US)','a US citizen' ),
        ( 'ARGENTINA','AR','Argentinian','an Argentinian' ),
        ( 'AUSTRALIA','AU','Australian','an Australian' ),
        ( 'BAHAMAS','BS','Bahamian','a Bahamian' ),
        ( 'BELGIUM','BE','Belgian','a Belgian' );


CREATE INDEX idx_Nationality ON Nationality 
(
    Nationality_ID ASC,
    Country ASC
);

comment on table nationality is 'CreatedBy: Dan Flynn, Sr. SQL Server DBA
CreationDate: 02/12/2014

Nationality table contains five columns, i.e.:

1. NationalityID, 2. Country, 3. Abbreviation, 4. Adjective, 5. Person

IDs 1 to 34 are alphabetical countries that are statistically the most popular as far as interaction with the United States.  IDs 35 to 248 are also alphabetical for the rest of the countries.
';

我有点惊讶没有定义主键。您可能想要添加:

alter table nationality
   add primary key (nationality_id);