powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / добавить запись в таблицу
13 сообщений из 13, страница 1 из 1
добавить запись в таблицу
    #39735980
HarrySmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день
я только пробую Postgree он имеет большое отличие от MSSql в связи с этим прошу помощи.
Есть таблица (как данность)
CREATE TABLE public.card_clients
(
id bigint NOT NULL,
firstname character varying(255) COLLATE pg_catalog."default",
sendcatalog boolean NOT NULL
CONSTRAINT card_clients_pkey PRIMARY KEY (id)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.card_clients
OWNER to postgres;

требуется вставить строку со следующим порядковым номером ID

запрос такого плана
INSERT INTO public.card_clients(
firstname, sendcatalog)
VALUES ('zzzzzzzzzzz', false);
возвращает ошибку
ERROR: ОШИБКА: нулевое значение в столбце "id" нарушает ограничение NOT NULL
Ну оно и понятно.

А как сделать чтобы при insert генерился след номер ID (который надо знать для дальнейшего использования) не изменяя структуру таблицы?
...
Рейтинг: 0 / 0
добавить запись в таблицу
    #39735993
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HarrySmith,

1. CREATE SEQUENCE card_clients_id;
ALTER TABLE card_clients ALTER id SET DEFAULT nextval('card_clients_id');
ALTER SEQUENCE card_clients_id OWNED BY card_clients.id; -- свяжет SEQUENCE с таблицей, если таблицу снесут, то и SEQUENCE каскадом тоже

2. При создании таблицы указать `id bigserial NOT NULL`, что будет равносильно тому, что я выше написал (синтаксическая обёртка).
...
Рейтинг: 0 / 0
добавить запись в таблицу
    #39736008
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovHarrySmith,

1. CREATE SEQUENCE card_clients_id;
ALTER TABLE card_clients ALTER id SET DEFAULT nextval('card_clients_id');
ALTER SEQUENCE card_clients_id OWNED BY card_clients.id; -- свяжет SEQUENCE с таблицей, если таблицу снесут, то и SEQUENCE каскадом тоже

2. При создании таблицы указать `id bigserial NOT NULL`, что будет равносильно тому, что я выше написал (синтаксическая обёртка).

Задача была "не изменяя структуру таблицы" вообще то. :)


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
добавить запись в таблицу
    #39736014
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HarrySmithА как сделать чтобы при insert генерился след номер ID (который надо знать для дальнейшего использования) не изменяя структуру таблицы?

Тогда надо будет изменить сам запрос вставки
сделав 1 раз
CREATE SEQUENCE card_clients_id;

и потом вызывая
INSERT INTO public.card_clients(
id, firstname, sendcatalog)
VALUES (nextval('card_clients_id'),'zzzzzzzzzzz', false)
RETURNING id;

PS: но да как выше написали лучше структуру таблицы поменять оно менее коряво будет.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
добавить запись в таблицу
    #39736590
HarrySmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

Maxim BogukCREATE SEQUENCE card_clients_id;

и потом вызывая
INSERT INTO public.card_clients(
id, firstname, sendcatalog)
VALUES (nextval('card_clients_id'),'zzzzzzzzzzz', false)
RETURNING id;


отлично затем этим значением надо обновить поле связанной таблицы
плана update table set col1=id where key=1

но вот вопрос наверное это все надо делать в транзакции или нет и если да то как?
пример транзакции взятый с официального сайта

BEGIN
update card_clients set building='33' WHERE id=33;
COMMIT

сразу ругается на

ERROR: ОШИБКА: ошибка синтаксиса (примерное положение: "BEGIN")
LINE 1: ...,COSTS False,TIMING False,SUMMARY False,BUFFERS False) BEGIN
^


SQL-состояние: 42601
Символ: 104

может не надо транзакции?
...
Рейтинг: 0 / 0
добавить запись в таблицу
    #39736711
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HarrySmithMaxim Boguk,

Maxim BogukCREATE SEQUENCE card_clients_id;

и потом вызывая
INSERT INTO public.card_clients(
id, firstname, sendcatalog)
VALUES (nextval('card_clients_id'),'zzzzzzzzzzz', false)
RETURNING id;


отлично затем этим значением надо обновить поле связанной таблицы
плана update table set col1=id where key=1

но вот вопрос наверное это все надо делать в транзакции или нет и если да то как?
пример транзакции взятый с официального сайта

BEGIN
update card_clients set building='33' WHERE id=33;
COMMIT

сразу ругается на

ERROR: ОШИБКА: ошибка синтаксиса (примерное положение: "BEGIN")
LINE 1: ...,COSTS False,TIMING False,SUMMARY False,BUFFERS False) BEGIN
^


SQL-состояние: 42601
Символ: 104

может не надо транзакции?

Может надо посмотреть какие поля есть в таблице и какие в запросе?
...
Рейтинг: 0 / 0
добавить запись в таблицу
    #39736761
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HarrySmith,

BEGIN — такая же команда как и SELECT и её также надо закончить ';' чтобы она отработала.
Как и COMMIT.
...
Рейтинг: 0 / 0
добавить запись в таблицу
    #39737351
HarrySmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не могу сделать
CREATE SEQUENCE card_clients_id;
валит ошибки
ERROR: ОШИБКА: ошибка синтаксиса (примерное положение: "SEQUENCE")
LINE 1: ...,TIMING False,SUMMARY False,BUFFERS False) CREATE SEQUENCE c...
^


SQL-состояние: 42601
Символ: 111
...
Рейтинг: 0 / 0
добавить запись в таблицу
    #39737359
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HarrySmith,

судя по всему у вас слишком глупый клиент к базе (прикидывающийся умным) и делает совсем не то, что просили.
...
Рейтинг: 0 / 0
добавить запись в таблицу
    #39737361
HarrySmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pgAdmin4 подскажите лучше
...
Рейтинг: 0 / 0
добавить запись в таблицу
    #39737384
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HarrySmith,

psql
...
Рейтинг: 0 / 0
добавить запись в таблицу
    #39737388
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkijHarrySmith,

psql
блокнот жи, чо мелочиться


2ТС вы пытаетесь построить план выполнения, а не выполнить набор команд.
а это возможно только для одиночных dml - стейтментов. создание сиквенсов к таким не относится. это уже ddl.
...
Рейтинг: 0 / 0
добавить запись в таблицу
    #39737401
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HarrySmithне могу сделать
CREATE SEQUENCE card_clients_id;
валит ошибки
ERROR: ОШИБКА: ошибка синтаксиса (примерное положение: "SEQUENCE")
LINE 1: ...,TIMING False,SUMMARY False,BUFFERS False) CREATE SEQUENCE c...
^


SQL-состояние: 42601
Символ: 111


А вы сами не видите что у вас изза отсутствия ; 2 комманды слились???
скорее всего недописанный explain analyze и CREATE SEQUENCE
ЛЮБАЯ sql комманда чтобы она исполнилас должна быть завершена ;


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / добавить запись в таблицу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]