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