Вставка Postgres в указанный столбец таблицы из другого столбца в той же таблице, где существует первичный ключ

sql #postgresql

#sql #postgresql

Вопрос:

Я покопался здесь, и принятые ответы на другие вопросы мне не помогли.

У меня есть таблица «mytable», определенная как таковая

 create table mytable (
column1 varchar(50) PRIMARY KEY,
column2 integer,
column3 money
)
 

все значения столбца 3 равны нулю, и я хочу вставить column2 / 1.25 в column3

Я пробовал эти:

 --This gets 23502 "violates not-null constraint"
insert into mytable (column3)
select column2/1.25 from mytable

--This gets 42601 "syntax error near "select""
insert into mytable (column3)
select column2/1.25 from mytable

--Same as above with parentheses, gets the same error
insert into mytable (column3) values
(select column2/1.25 from mytable )

--Error 42601 "syntax error at or near "select""
insert into mytable (column1,column3) values
(select column1, column2/1.25 from mytable)
 

Я пробовал другие небольшие варианты круглых скобок, полей в двойных кавычках, но не могу понять, почему это вызывает у меня ошибки. Column1 является первичным ключом и не обнуляется, но я не пытаюсь вставить в этот столбец.

Любая помощь будет оценена

Комментарии:

1. Если вы хотите изменить значение столбца в существующей строке, вам необходимо использовать функцию UPDATE

Ответ №1:

INSERT добавляет новые строки в таблицу, которые вам не нужны. Чтобы изменить существующие строки, используйте UPDATE :

 UPDATE mytable
SET column3 = column2 / 1.25;
 

Но это плохая идея по нескольким причинам:

  1. Избегайте этого money типа. Вместо этого используйте что-то вроде numeric(15,2) .
  2. Не храните избыточные данные в базе данных, если это не неизбежно по соображениям производительности. Вы могли бы использовать представление:
     CREATE VIEW myview AS
    SELECT column1, column2,
           CAST (column2 / 1.25 AS numeric(15,2)) AS column3
    FROM mytable;
     
  3. Если вы действительно хотите сохранить избыточные данные, используйте сгенерированный столбец:
     ALTER TABLE mytable
    ADD column3 numeric(15,2) GENERATED ALWAYS AS (column2 / 1.25) STORED;
     

Ответ №2:

Команда INSERT используется для вставки новой строки в таблицу. Вам нужно обновить существующую строку.

https://www.postgresqltutorial.com/postgresql-update/

 UPDATE mytable
SET column3 = column2/1.25