Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres从不同的表导入_Sql_Postgresql_Database Migration - Fatal编程技术网

Sql Postgres从不同的表导入

Sql Postgres从不同的表导入,sql,postgresql,database-migration,Sql,Postgresql,Database Migration,我对博士后还是相当陌生的。我有一个名为:university\u table的表,其中包含字段:name, 国籍,缩写,形容词,人 我发现此sql查询可从以下位置插入数据: 下面的查询片段。 如何更改查询以将这些值插入myuniversity\u country表 --创建并加载国籍表-英语 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Nationality]') AND type in

我对博士后还是相当陌生的。我有一个名为:
university\u table
的表,其中包含字段:name, 国籍,缩写,形容词,人

我发现此sql查询可从以下位置插入数据: 下面的查询片段。 如何更改查询以将这些值插入my
university\u country
表 --创建并加载国籍表-英语

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 Server)
  • 删除
    [dbo]。
    如果您没有在Postgres中创建架构前缀(通常不创建)
  • 删除[Primary]上的
    选项,它在Postgres中不需要(相当于定义一个表空间,但在Postgres中几乎不需要)
  • SQL(或Postgres)中没有
    IF
    ,要有条件地删除表,请使用
    drop table IF EXISTS…
  • Postgres中没有聚集索引,因此只需将其作为常规索引,并删除
    WITH
    关键字引入的所有选项即可
  • 表上的注释是通过定义的,而不是通过调用存储过程定义的
  • identity(x,y)
    需要用始终作为identity生成的标准SQL
    替换
  • 没有
    nvarchar
    类型,只需将所有内容都设置为
    varchar
    ,并确保您的数据库是使用可以存储多字节字符的编码创建的(默认情况下,它是UTF-8,所以应该可以)
  • 不需要,但是:强烈建议在Postgres中使用
    snake\u case
    标识符,而不是
    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);
    

    [dbo]
    是什么意思?这看起来像是sql server语法,在Postgres中不起作用。我希望您不要真的使用Postgres 9.3-它是。如果你真的这样做了,你应该升级到一个受支持的版本(例如11或12),现在我要做的是将行粘贴到一个txt文件中,删除引号和括号,并在数据库中为每一行迭代创建一个Nationary对象,但这就是我想要的答案。