Error type bigserial does not exist

Невозможно изменить тип данных bigint на smallserial в существующей базе данных [duplicate] Мы оказываемся во вселенной, которая, по-видимому, развивается по измерению, которое мы называем «временем». Мы не понимаем, какое время, но мы разработали абстракции и словарный запас, которые позволяют рассуждать и говорить об этом: «прошлое», «настоящее», «будущее», «до», «после». Компьютерные системы, которые мы строим […]

Содержание

  1. Невозможно изменить тип данных bigint на smallserial в существующей базе данных [duplicate]
  2. Enter обещает
  3. Ключевое слово async
  4. ERROR Database error 42704: type «number» does not exist while migrating from sqlite #1284
  5. Comments
  6. Error 42704 — does mean what?
  7. getting SQL state: 42704 error creating foreign table #240
  8. Comments
  9. Преобразование типа столбца PostgreSQL из bigint в bigserial
  10. 4 ответа

Невозможно изменить тип данных bigint на smallserial в существующей базе данных [duplicate]

Мы оказываемся во вселенной, которая, по-видимому, развивается по измерению, которое мы называем «временем». Мы не понимаем, какое время, но мы разработали абстракции и словарный запас, которые позволяют рассуждать и говорить об этом: «прошлое», «настоящее», «будущее», «до», «после».

Компьютерные системы, которые мы строим — все больше и больше — имеют время как важное измерение. В будущем будут созданы определенные вещи. Тогда другие вещи должны произойти после того, как эти первые вещи в конечном итоге произойдут. Это основное понятие, называемое «асинхронность». В нашем мире с более сложной сетью наиболее распространенный случай асинхронности ожидает, что какая-то удаленная система ответит на какой-либо запрос.

Рассмотрим пример. Вы называете молочника и заказываете молоко. Когда это произойдет, вы хотите положить его в свой кофе. Вы не можете положить молоко в свой кофе прямо сейчас, потому что его еще нет. Вы должны подождать, пока это произойдет, прежде чем положить его в свой кофе. Другими словами, следующее не будет работать:

Поскольку JS не знает, что ему нужно дождаться окончания order_milk , прежде чем он выполнит put_in_coffee . Другими словами, он не знает, что order_milk является асинхронным — это то, что не приведет к молоку до некоторого будущего времени. JS и другие декларативные языки, выполняйте один оператор за другим, не ожидая.

Классический подход JS к этой проблеме, используя тот факт, что JS поддерживает функции как объекты первого класса, которые могут быть переданы, заключается в передаче функции в качестве параметра для асинхронного запроса, который затем будет вызываться, когда он будет выполнять свою задачу в будущем. Это подход «обратного вызова». Это выглядит так:

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

Проблема с этот подход обратного вызова состоит в том, что он загрязняет нормальную семантику функции, сообщающей свой результат с помощью return ; вместо этого функции должны сообщать свои результаты, вызывая обратный вызов, заданный как параметр. Кроме того, этот подход может быстро стать громоздким при работе с более длинными последовательностями событий. Например, предположим, что я хочу дождаться, когда молоко будет помещено в кофе, а затем и только затем выполните третий шаг, а именно — выпить кофе. В конце концов мне нужно написать что-то вроде этого:

, где я перехожу к put_in_coffee как к молоку, чтобы положить в него, так и к действию ( drink_coffee ), чтобы выполнить как только молоко был введен. Такой код становится трудно писать, читать и отлаживать.

В этом случае мы могли бы переписать код в вопросе как:

Enter обещает

. Это была мотивация для понятия «обещание», которое является особым типом ценности, представляющим собой будущий или асинхронный результат какого-то рода. Он может представлять что-то, что уже произошло, или это произойдет в будущем, или, возможно, никогда не произойдет вообще. Обещания имеют один метод, названный then , которому вы передаете действие, которое должно быть выполнено, когда был достигнут результат, представленный обещанием.

В случае нашего молока и кофе мы создаем order_milk , чтобы вернуть обещание о прибытии молока, затем укажите put_in_coffee как действие then следующим образом:

. Одно из преимуществ этого заключается в том, что мы можем объединить их вместе для создания последовательностей будущие вхождения («цепочка»):

Давайте применим обещания к вашей конкретной проблеме. Мы завершим нашу логику запроса внутри функции, которая возвращает обещание:

На самом деле, все, что мы сделали, добавлено к return к вызову $.ajax . Это работает, потому что jQuery $.ajax уже возвращает вид обетоподобной вещи. (На практике, не вдаваясь в подробности, мы предпочли бы обернуть этот вызов, чтобы вернуть реальное обещание, или использовать некоторую альтернативу $.ajax , которая делает это.) Теперь, если мы хотим загрузить файл и дождаться его завершите, а затем сделайте что-нибудь, мы можем просто сказать

. При использовании обещаний мы заканчиваем передачу множества функций в then , поэтому часто полезно использовать более компактные функции стрелок в стиле ES6:

Ключевое слово async

Но все еще есть что-то неопределенное в том, что нужно писать код одним способом, если синхронно и совершенно по-другому, если асинхронно. Для синхронного мы пишем

, но если a является асинхронным, с обещаниями мы должны написать

Выше, мы сказали: «JS не имеет никакого способа узнать что ему нужно дождаться завершения первого вызова, прежде чем он выполнит второй ». Было бы неплохо, если бы можно было сказать JS? Оказывается, существует ключевое слово await , используемое внутри специального типа функции, называемого функцией «async». Эта функция является частью предстоящей версии ES, но уже доступна в транспилерах, таких как Babel, с учетом правильных настроек. Это позволяет нам просто написать

. В вашем случае вы могли бы написать что-то вроде

Источник

ERROR Database error 42704: type «number» does not exist while migrating from sqlite #1284

Getting ERROR Database error 42704: type «number» does not exist while migrating from sqlite

2021-05-09T18:10:20.272691+01:00 ERROR Database error 42704: type «number» does not exist QUERY: CREATE TABLE builds ( build_id bigserial, build_repo_id bigint, build_trigger text, build_number bigint, build_parent bigint, build_status text, build_error text, build_event text, build_action text, build_link text, build_timestamp bigint, build_title text, build_message text, build_before text, build_after text, build_ref text, build_source_repo text, build_source text, build_target text, build_author text, build_author_name text, build_author_email text, build_author_avatar text, build_sender text, build_deploy text, build_params text, build_started bigint, build_finished bigint, build_created bigint, build_updated bigint, build_version bigint, build_debug boolean default ‘0’, build_cron text default », build_deploy_id number default ‘0’ ); 2021-05-09T18:10:20.290184+01:00 FATAL Failed to create the schema, see above. Initially the error was the octet sequence #(128) cannot be decoded. An unhandled error condition has been signalled: :UTF-8 stream decoding error on # : the octet sequence #(128) cannot be decoded. «>

  • data that is being loaded, if relevant
  • How the data is different from what you expected, if relevant
  • It seems like as the build_deploy_id is type of number and this type is not present in PostgreSQL, So I have to create a new table with type bigint and than copied the data after renaming the table to get this working, so just checking if this can be handled

The text was updated successfully, but these errors were encountered:

Источник

Error 42704 — does mean what?

From: Kim Bisgaard
To: pgsql-general(at)postgresql(dot)org
Subject: Error 42704 — does mean what?
Date: 2012-10-15 07:37:43
Message-ID: 507BBD47.7030505@alleroedderne.adsl.dk
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

[Cross post from -SQL]

I am trying to model a macro system where I have simple things, and more complex thing consisting of simple things. To do that I have
«invented» this table definition:

CREATE TABLE params
(
param_id serial NOT NULL,
name text NOT NULL,
unit text,
real_param_id integer[],
CONSTRAINT params_pkey PRIMARY KEY (param_id),
CONSTRAINT params_name_key UNIQUE (name)
);

with a complex and 2 simple things:
INSERT INTO params VALUES (1, ‘a’, NULL, ‘<1,2>‘);
INSERT INTO params VALUES (2, ‘a1’, ‘1’, NULL);
INSERT INTO params VALUES (3, ‘a2’, ‘2’, NULL);

with this SQL:
select name, array[array[name::text,unit::text]]::text[][]
from params
where real_param_id is null
union
select name, array(select cast(‘<«‘||a.name||'»,»‘||a.unit||'»>‘ as text[])
from params a,
(select c.param_id, unnest(real_param_id)
from params c
where c.param_id=b.param_id) as j
where a.param_id = j.unnest)
from params b
where b.real_param_id is not null
order by name

But I am getting this error which I do not find very informative, as I know i can have arrays of text and arrays of those, so what is up?

ERROR: could not find array type for data type text[]
SQL state: 42704

Suggestions as to what to do to circumvent this error, and also to maybe more elegant ways to solve the fundamental problem will be received
with pleasure.

This is tested on both PostgreSQL 9.2.1 and a 9.1.*

Источник

getting SQL state: 42704 error creating foreign table #240

Hi Laurenz, I’m running postgresql under ubuntu and i’m trying migration with oracle_fdw but I stopped facing an issue creating a foreign table. Could You help me?
I compiled oracle_fwd 1.5 (2.0 was giving me dependencies issues) and succesfully installed extension on my ubuntu.
Following instructions I create the foreign server:
CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver ‘//10.10.20.100:1521/GDBT’);
I granted user postgres:
GRANT USAGE ON FOREIGN SERVER oradb TO postgres;
then I created user mapping:
CREATE USER MAPPING FOR postgres SERVER oradb OPTIONS (user ‘UTENTE’, password ‘pwd’);
now I’m trying to create a foreing table:

but i’m getting the following error:

What am I doing wrong?

note1: I can retrieve foreign server by;
SELECT srvname,srvoptions FROM pg_foreign_server;
getting:
oradb
and foreign connection detail:
SELECT oracle_diag(‘oradb’)
getting:
oracle_fdw 1.5.0, PostgreSQL 9.3.4, Oracle client 12.2.0.1.0, Oracle server 11.2.0.4.0

note2: I can succefully connect to oracle by sqlplus:
sqlplus UTENTE/pwd@//10.10.20.100:1521/GDBT
having access to TEST table:

note3: I’m currently using other foreign tables with postgres_fdw extension

The text was updated successfully, but these errors were encountered:

Источник

Преобразование типа столбца PostgreSQL из bigint в bigserial

Когда я пытаюсь изменить тип данных столбца в таблице с помощью команды alter.

Как изменить тип данных с bigint на bigserial?

4 ответа

Это простой обходной путь:

Похоже, в этом вопросе много профессионалов. если в исходной таблице действительно были данные, то реальный ответ на эту дилемму заключается в том, чтобы в первую очередь правильно спроектировать базу данных. Однако в этом случае для изменения правила столбца (типа) потребуется проверка целостности этого столбца для новой парадигмы. И, не забывайте, везде, где этот столбец манипулируется (добавляется/обновляется), это нужно будет изучить.

Если это новая таблица, то все в порядке, просто: удалите столбец и повторно добавьте новый столбец (за вас позаботится о последовательности). Опять же, дизайн, дизайн, дизайн.

Я думаю, что мы все запутались в этом.

ALTER изменение столбца с BIGINTEGER на BIGSERIAL для автоматического увеличения не будет работать. BIGSERIAL не является истинным типом, это трюк, который автоматизирует создание PK и SEQUENCE .

Вместо этого вы можете создать последовательность самостоятельно, а затем назначить ее по умолчанию для столбца:

Как поясняется в документации, SERIAL — это не тип данных, а ярлык для набора других команд.

Поэтому, хотя вы не можете изменить его, просто изменив тип, вы можете добиться того же эффекта, выполнив эти другие команды самостоятельно:

Изменение владельца гарантирует, что последовательность будет удалена, если таблица/столбец будет удалена. Это также даст вам ожидаемое поведение в pg_get_serial_sequence().

Придерживаться соглашения об именах tablename_columnname_seq необходимо, чтобы некоторые инструменты, такие как pgAdmin, сообщали об этом типе столбца как BIGSERIAL . Обратите внимание, что psql и pg_dump всегда будут отображать базовое определение, даже если столбец изначально был объявлен как тип SERIAL .

Источник

I’m confused, this looks fairly unrelated to the original message that I had sent?

Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us> wrote:

>Alvaro Herrera wrote:
>> On Sat, Jan 22, 2005 at 10:28:16PM +0000, Brad Snobar wrote:
>>
>> > The column was a primary key bigint.
>> >
>> > ALTER TABLE «public».»CategoryBuildingRankSchemas»
>> >   ALTER COLUMN «IDCategoryBuildingRankSchema» TYPE BIGSERIAL;
>> >
>> > ERROR:  type «bigserial» does not exist
>>
>> Bigserial is not a type.  Rather, it’s a type «with strings
>> attached».  You can achieve the same effect by using
>>
>> alter table foo alter column a type bigint,
>>       alter column a set default nextval(‘seq’);
>>
>> Sadly, you have to create the sequence by hand, and it won’t be dropped
>> when the table is dropped.
>
>I tried just altering the column from ‘integer’ to ‘bigint’ and it
>seemed to work:
>
>    test=> create table test (x serial);
>    NOTICE:  CREATE TABLE will create implicit sequence «test_x_seq» for serial column «test.x»
>    CREATE TABLE
>    test=> d test
>                              Table «public.test»
>     Column |  Type   |                      Modifiers
>    ———+———+——————————————————
>     x      | integer | not null default nextval(‘public.test_x_seq’::text)
>    
>    test=> alter table test alter column x type bigint;
>    ALTER TABLE
>    test=> d test
>                              Table «public.test»
>     Column |  Type  |                      Modifiers
>    ———+———+——————————————————
>     x      | bigint | not null default nextval(‘public.test_x_seq’::text)
>
>All sequences are bigint so there is nothing to change there.
>
>So, I think the trick is to change the underlying column type but not
>change the default which is tied to the sequence.
>
>This certainly is an interesting usage report.
>
>—
>  Bruce Momjian                        |  http://candle.pha.pa.us
>  pgman(at)candle(dot)pha(dot)pa(dot)us               |  (610) 359-1001
>  +  If your life is a hard drive,     |  13 Roberts Road
>  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
>

__________________________________________________________________
Switch to Netscape Internet Service.
As low as $9.95 a month — Sign up today at http://isp.netscape.com/register

Netscape. Just the Net You Need.

New! Netscape Toolbar for Internet Explorer
Search from anywhere on the Web and block those annoying pop-ups.
Download now at http://channels.netscape.com/ns/search/install.jsp

Когда я пытаюсь изменить тип данных столбца в таблице с помощью команды alter…

alter table temp alter column id type bigserial;

я получил

ERROR:  type "bigserial" does not exist

Как я могу изменить тип данных с bigint на bigserial?

4b9b3361

Ответ 1

Как объясняется в документации, SERIAL — это не тип данных, а ярлык для набора других команд.

Поэтому, хотя вы не можете изменить его, просто изменив тип, вы можете добиться того же эффекта, выполнив эти другие команды самостоятельно:

CREATE SEQUENCE temp_id_seq;
ALTER TABLE temp ALTER COLUMN id SET NOT NULL;
ALTER TABLE temp ALTER COLUMN id SET DEFAULT nextval('temp_id_seq');
ALTER SEQUENCE temp_id_seq OWNED BY temp.id;

Изменение владельца гарантирует, что последовательность будет удалена, если таблица/столбец будет удалена. Это также даст вам ожидаемое поведение в функции pg_get_serial_sequence().

Придерживаясь соглашения об именах tablename_columnname_seq, необходимо убедить некоторые инструменты, такие как pgAdmin, сообщать об этом типе столбца как BIGSERIAL. Обратите внимание, что psql и pg_dump всегда будут показывать базовое определение, даже если столбец был первоначально объявлен как тип SERIAL.

Начиная с Postgres 10, у вас также есть возможность использовать стандартный столбец идентификаторов SQL, который обрабатывает все это незаметно и который можно легко добавить в существующую таблицу:

ALTER TABLE temp ALTER COLUMN id
  ADD GENERATED BY DEFAULT AS IDENTITY

Ответ 2

ALTER ИНГ столбец из BIGINTEGER в BIGSERIAL для того, чтобы сделать его автоинкрементным не будет работать. BIGSERIAL — это не настоящий тип, это трюк, который автоматизирует создание PK и SEQUENCE.

Вместо этого вы можете создать последовательность самостоятельно, а затем назначить ее по умолчанию для столбца:

CREATE SEQUENCE "YOURSCHEMA"."SEQNAME";

ALTER TABLE "YOURSCHEMA"."TABLENAME"
   ALTER COLUMN "COLUMNNAME" SET DEFAULT nextval('"YOURSCHEMA"."SEQNAME"'::regclass);
ALTER TABLE "YOURSCHEMA"."TABLENAME" ADD CONSTRAINT pk PRIMARY KEY ("COLUMNNAME");

Ответ 3

Это простой обходной путь:

ALTER TABLE table_name drop column column_name, add column column_name bigserial;

Ответ 4

Postgres for SERIAL создает столбец с типом int и соответствующей последовательностью и устанавливает значение по умолчанию из последовательности в этот столбец. Вам просто нужно обновить тип столбца:

alter table temp alter column id type BIGINT;

и он будет работать как BIGSERIAL.

Когда я пытаюсь изменить тип данных столбца в таблице с помощью команды alter…

alter table temp alter column id type bigserial;

Я получил

ERROR:  type "bigserial" does not exist

Как изменить тип данных с bigint на bigserial?

4 ответа

Это простой обходной путь:

ALTER TABLE table_name drop column column_name, add column column_name bigserial;


2

Rishav
9 Май 2018 в 00:33

Похоже, в этом вопросе много профессионалов… если в исходной таблице действительно были данные, то реальный ответ на эту дилемму заключается в том, чтобы в первую очередь правильно спроектировать базу данных. Однако в этом случае для изменения правила столбца (типа) потребуется проверка целостности этого столбца для новой парадигмы. И, не забывайте, везде, где этот столбец манипулируется (добавляется/обновляется), это нужно будет изучить.

Если это новая таблица, то все в порядке, просто: удалите столбец и повторно добавьте новый столбец (за вас позаботится о последовательности). Опять же, дизайн, дизайн, дизайн.

Я думаю, что мы все запутались в этом.


-3

John Smith
20 Апр 2020 в 18:15

ALTERизменение столбца с BIGINTEGER на BIGSERIAL для автоматического увеличения не будет работать. BIGSERIAL не является истинным типом, это трюк, который автоматизирует создание PK и SEQUENCE.

Вместо этого вы можете создать последовательность самостоятельно, а затем назначить ее по умолчанию для столбца:

CREATE SEQUENCE "YOURSCHEMA"."SEQNAME";

ALTER TABLE "YOURSCHEMA"."TABLENAME"
   ALTER COLUMN "COLUMNNAME" SET DEFAULT nextval('"YOURSCHEMA"."SEQNAME"'::regclass);
ALTER TABLE "YOURSCHEMA"."TABLENAME" ADD CONSTRAINT pk PRIMARY KEY ("COLUMNNAME");


11

Craig Ringer
12 Авг 2015 в 16:47

Как поясняется в документации, SERIAL — это не тип данных, а ярлык для набора других команд.

Поэтому, хотя вы не можете изменить его, просто изменив тип, вы можете добиться того же эффекта, выполнив эти другие команды самостоятельно:

CREATE SEQUENCE temp_id_seq;
ALTER TABLE temp ALTER COLUMN id SET NOT NULL;
ALTER TABLE temp ALTER COLUMN id SET DEFAULT nextval('temp_id_seq');
ALTER SEQUENCE temp_id_seq OWNED BY temp.id;

Изменение владельца гарантирует, что последовательность будет удалена, если таблица/столбец будет удалена. Это также даст вам ожидаемое поведение в pg_get_serial_sequence().

Придерживаться соглашения об именах tablename_columnname_seq необходимо, чтобы некоторые инструменты, такие как pgAdmin, сообщали об этом типе столбца как BIGSERIAL. Обратите внимание, что psql и pg_dump всегда будут отображать базовое определение, даже если столбец изначально был объявлен как тип SERIAL.

Начиная с Postgres 10, у вас также есть возможность использовать стандартный SQL-столбец identity, который обрабатывает все это незаметно и который вы можете легко добавить в существующую таблицу:

ALTER TABLE temp ALTER COLUMN id
  ADD GENERATED BY DEFAULT AS IDENTITY


40

Nick Barnes
10 Июл 2018 в 12:13

roboslone

Migrator fails with SQLSTATE 42704

GORM Playground Link

go-gorm/playground#433

Description

Model:

type Group struct {
	ID    string `gorm:"primaryKey"`
	GID   uint32 `gorm:"not null;autoIncrement"`
	...
}

Migrator error:

ERROR: type "bigserial" does not exist (SQLSTATE 42704)

Previously this table was created by GORM with type bigint.
I’m using latest versions of both GORM (v1.22.5) and potgres-driver (v1.2.3).

#4792 seems related, but there’s nothing to upgrade to.

Switching to gorm:"type:bigserial" or gorm:"type:bigint;unique;autoIncrement" does not help.

github-actions

The issue has been automatically marked as stale as it missing playground pull request link, which is important to help others understand your issue effectively and make sure the issue hasn’t been fixed on latest master, checkout https://github.com/go-gorm/playground for details. it will be closed in 2 days if no further activity occurs. if you are asking question, please use the Question template, most likely your question already answered https://github.com/go-gorm/gorm/issues or described in the document https://gorm.io ✨ Search Before Asking ✨

roboslone

@jinzhu please take a look at this.

roboslone

This patch seems to fix the test, but I doubt that’s the right way to do it.

func (m Migrator) AlterColumn(value interface{}, field string) error {
	return m.RunWithValue(value, func(stmt *gorm.Statement) error {
		if field := stmt.Schema.LookUpField(field); field != nil {
			fileType := clause.Expr{SQL: m.DataTypeOf(field)}
+
+			switch (fileType.SQL) {
+			case "smallserial":
+				fileType.SQL = "smallint"
+			case "serial":
+				fileType.SQL = "integer"
+			case "bigserial":
+				fileType.SQL = "bigint"
+			}
+
			return m.DB.Exec(
				"ALTER TABLE ? ALTER COLUMN ? TYPE ?",
				m.CurrentTable(stmt), clause.Column{Name: field.DBName}, fileType,
			).Error

		}
		return fmt.Errorf("failed to look up field with name: %s", field)
	})
}

roboslone

Maybe it’s better to not alter such columns at all:

func (m Migrator) AlterColumn(value interface{}, field string) error {
	return m.RunWithValue(value, func(stmt *gorm.Statement) error {
		if field := stmt.Schema.LookUpField(field); field != nil {
			fileType := clause.Expr{SQL: m.DataTypeOf(field)}

+			switch fileType.SQL {
+			case "smallserial":
+				fallthrough
+			case "serial":
+				fallthrough
+			case "bigserial":
+				return nil
+			}

			return m.DB.Exec(
				"ALTER TABLE ? ALTER COLUMN ? TYPE ?",
				m.CurrentTable(stmt), clause.Column{Name: field.DBName}, fileType,
			).Error

		}
		return fmt.Errorf("failed to look up field with name: %s", field)
	})
}

roboslone

Any luck here? Can I do anything to help resolve this?

Genora51

I’m experiencing similar issues: any update on this @jinzhu ?

a631807682

Goldziher

i am having a similar issue with this:

	Position              int            `gorm:"type:serial" json:"position"`  

It tries to automigrate this column time-and-time again, even when i dump the DB and start from scratch.

roboslone

Should this be resolved in v1.23.5? I still get the type "bigserial" does not exist (SQLSTATE 42704) error. Is there a version I can check?

jinzhu

upgrade postgres driver.

roboslone

Toflex

Thanks, it works!

What version of Postgres driver worked for you?

roboslone

@Toflex gorm.io/driver/postgres v1.3.5

ridwankustanto

I still get error type "bigserial" does not exist (SQLSTATE 42704) after update to gorm.io/driver/postgres v1.3.5 on alter table.

Понравилась статья? Поделить с друзьями:
  • Error type 0x01
  • Error txbuf alloc
  • Error two or more data types in declaration of main
  • Error two declarations cause a collision in the objectfactory class
  • Error tweakdb compilation has failed