如何将整列插入我之前在 pgAdmin4 中创建的 table?

How do I insert entire columns into my previously created table in pgAdmin4?

给定 2 个名为学生(姓名、课程)和教授(ProfID、姓名、课程)的 csv 文件。

使用给定的代码:

cur.execute('INSERT INTO TABLE (col1, col2, col3) VALUES(%s, %s)', (value1, value2, value3))

cur.execute(query)
set1 = cur.fetchall()
set2 = cur.fetchone()

现有table: ProfID、姓名、课程

没有现有的学号。我怎样才能将它们分配给每个学生?

如何将上述示例中的列(csv 文件中的所有值,不限于上述 3 个值)插入我的 table? 以及如何对 table 的数据进行重复数据删除?

可能有很多可能的解决方案,但是,我尝试仅使用 SQL 脚本自行创建。

我使用以下脚本创建了一个 table。

CREATE TABLE public.my_table
(
    column_one character varying(20) COLLATE pg_catalog."default",
    column_two character varying(20) COLLATE pg_catalog."default",
    column_three character varying(20) COLLATE pg_catalog."default",
    column_four character varying(20) COLLATE pg_catalog."default"
);

暂时我手动插入数据

INSERT INTO public.my_table(column_one, column_two, column_three, column_four) VALUES ('data1', 'data2', 'data3', 'data4');
INSERT INTO public.my_table(column_one, column_two, column_three, column_four) VALUES ('data11', 'data11', 'data11', 'data11');
INSERT INTO public.my_table(column_one, column_two, column_three, column_four) VALUES ('data21', 'data21', 'data21', 'data21');
INSERT INTO public.my_table(column_one, column_two, column_three, column_four) VALUES ('data31', 'data31', 'data31', 'data31');
INSERT INTO public.my_table(column_one, column_two, column_three, column_four) VALUES ('data41', 'data41', 'data41', 'data41');
INSERT INTO public.my_table(column_one, column_two, column_three, column_four) VALUES ('data51', 'data51', 'data51', 'data51');
INSERT INTO public.my_table(column_one, column_two, column_three, column_four) VALUES ('data61', 'data61', 'data61', 'data61');

然后我按照脚本

修改了table
ALTER TABLE my_table ADD COLUMN  column_id INTEGER;

之后我更新了循环中的列

BEGIN TRANSACTION;
DO $$
DECLARE 

    col_id bigint := 1 ;
    colTemp character(40);
BEGIN    
    FOR colTemp IN
        SELECT * FROM public.my_table 
    LOOP
        UPDATE my_table set column_id = col_id where column_one = colTemp;
        col_id := col_id + 1 ; 
    END LOOP;
    
END $$;
--ROLLBACK TRANSACTION; --rollback in case of exception
COMMIT TRANSACTION; --commit 

更改现有 table 结构时定义主键

ALTER TABLE my_table ADD PRIMARY KEY (column_id);

注意:请在将其用于某些测试数据之前对其进行测试。如果我误解了您的 questions/requirements,请原谅我。我花了很长时间才找到解决方案。任何类型的建议都将不胜感激。

编辑说明:我只是想通过一些改进来简化问题:-

ALTER TABLE my_table ADD COLUMN  column_id INTEGER;

循环变化

BEGIN TRANSACTION;
DO $$
DECLARE 
    col_id bigint := 1 ;
    colTemp record ;
BEGIN    
    FOR colTemp IN
        SELECT column_one, column_two, column_three, column_four
        FROM my_table
    LOOP
        UPDATE my_table set column_id = col_id where column_one = colTemp.column_one;
        col_id := col_id + 1 ; 
    END LOOP;
    
END $$;
--ROLLBACK TRANSACTION; --rollback in case of exception
COMMIT TRANSACTION; --commit

select 列中的最大 id 并在 seq 中递增 1

SELECT MAX(column_id) FROM my_table;

添加约束

-- select max id and add one to it in start value
CREATE SEQUENCE my_table_colid_seq
START 18 
INCREMENT 1
OWNED BY my_table.column_id;

ALTER TABLE my_table ALTER COLUMN column_id SET DEFAULT nextval('my_table_colid_seq');
ALTER TABLE my_table ADD CONSTRAINT  column_id_pk PRIMARY KEY (column_id)

解决方案 2:

ALTER TABLE my_table ADD COLUMN  column_id INTEGER;

CREATE SEQUENCE my_table_colid_seq
START 18 
INCREMENT 1
OWNED BY my_table.column_id;

ALTER TABLE my_table ALTER COLUMN column_id SET DEFAULT nextval('my_table_colid_seq');

UPDATE
    my_table
SET
    column_id = nextval('my_table_colid_seq');

注意-在运行随机查询之前,只是运行测试它并用数据做实验,tables.Please请原谅打字错误.任何建议将不胜感激。