Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: auto_increment(MYSQL) w PostgreSQL
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
DanielBB
Jak zrobić autonumerowanie w Postgre przy zakładaniu tabeli?
Z góry dzięki.
kurtz
Hej
Cytat
Jak zrobić autonumerowanie w Postgre przy zakładaniu tabeli?

http://pgsql.spsk1.pl/postgresql-faq.html i odpoweidz nr 16 ;)

Pozdrawiam
DanielBB
Wielkie dzieki. Czy do zinicjowania trzeba wpisać wartość początkową id?
KaMeLeOn
Cytat
Wielkie dzieki. Czy do zinicjowania trzeba wpisać wartość początkową id?

Nie trzeba...
DanielBB
Pytam bo na mySQL wszystko działa mi ok. Klopoty zaczęły się po zmianie przez usługodawce na PostgreSQL 7.2. Mam Komunikat:

Warning: pg_exec() query failed: ERROR: ExecAppend: Fail to add null value in not null attribute id in /home/smpolk/www/ksiegadodaj.php on line 24
blad bazy!
Podobny występuje w MySQL gdy w tworzeniu tabeli nie dałem auto_increment. Według wskazanego Faq'u wstawiłem id serial które powinno odpowiadać autonumeracji jaką miałem w MySQL'u:

[php:1:452692e0a9]
$laczenie=pg_Connect ("host=127.0.0.1 port=5432 dbname=smpolk user=smpolk password=costam");
$zapytanie = "CREATE TABLE wpis ("."id serial,".
"autor char(30),".
"email char (50), ".
"text varchar(255) not null,".
"datawpisu date default '2003-01-01' not null".
")";
$wynik = pg_Exec($laczenie,$zapytanie);
if($wynik) echo "Tabela założona prawidłowo !<br>";
else {
echo "Blad ! Tabela nie została założona !<br>";
}
[/php:1:452692e0a9]

Niestety nie działa. Działający fragment kodu w MySQL:

[php:1:452692e0a9]
mysql_connect("127.0.0.1","","");
$zapytanie = "CREATE DATABASE gosc";
$wynik = mysql_query($zapytanie);
if($wynik) echo "Baza została założona !<br>";
else echo "Baza nie została założona !<br>";
mysql_select_db(gosc);
$zapytanie = "CREATE TABLE wpis ( ".
"id int DEFAULT '0' NOT NULL auto_increment primary key, ".
"autor char(30), ".
"email char (50), ".
"text varchar(255) not null,".
"datawpisu date DEFAULT '0000-00-00' NOT NULL".
")";
$wynik = mysql_query($zapytanie);
if($wynik) echo "Tabela założona prawidłowo !<br>";
else {
echo "Blad ! Tabela nie została założona !<br>";
}
[/php:1:452692e0a9]
Pozdrawiam
scanner
Popraw znaczniki BBCode.
DanielBB
Linijka kodu:
[php:1:0adcb77e62]
$query = "INSERT INTO wpis VALUES(null, '$autor', '$text', ";
[/php:1:0adcb77e62]
dzała na Mysql ponieważ wartość null inicjuje autonumerowanie (wskazuje automatycznie że należy przejść do następnego rekordu w bazie)
Czy w Postgre 'null' trzeba zamienić na coś innego? Normalnie wyświetla się wypisany wcześniej komunikat o niemożności dodania wartości pustej.
Pozdrawiam
LeWaR
Cytat
[php:1:7124ae4438]
$query = "INSERT INTO wpis VALUES(null, '$autor', '$text', ";
[/php:1:7124ae4438]

Czy faktycznie masz przecinek na koncu zapytania sql??
DanielBB
Nie to jest fragment dłuższego zapytania łączonego za pomocą "." - to jest w porządku.
Widziałem w Chipie rozwiązanie w Postgre gdzie w linijce:
[php:1:0b706625aa]
$sql=insert into tabela values('konkretna_wartosc')";
[/php:1:0b706625aa]
nie jest wpisywana żadna wartość do klucza głównego aby rósł. W MySQL byłoby:
[php:1:0b706625aa]
$sql=insert into tabela values(null,'konkretna_wartosc')";
[/php:1:0b706625aa]
oczywiście przy założeniu że w Postgre mam pierwszą kolumnę id serial
a w MySQL id auto_increment...
LeWaR
Twoje:
[php:1:1d66793fad]<?php
$query = "INSERT INTO wpis VALUES(null, '$autor', '$text', ";
?>[/php:1:1d66793fad]

Ja bym zrobił taki wpis:

[php:1:1d66793fad]<?php
$query = "INSERT INTO wpis VALUES('', '$autor', '$text', ";
?>[/php:1:1d66793fad]
Zdaje się wtedy na baze, aby wstawiła wartość domyślną, a nie 'null'.
DanielBB
Dziwne ale przy rozwiązaniu '_' skrypt wysyła error o duplikacji klucza. Generalnie nie przechodzi do drugiego wiersza tylko próbuje chyba wpisywać ciągle do 1 rekordu.
DanielBB
Panowie dostałem na skrzynkę rozwiązanie od admina PostgreSQL.
zamiast null jest
nextval('wpis_id_seq')
Niezle 8O
Pozdrawiam
jezoo
Cytat(DanielBB)
Panowie dostałem na skrzynkę rozwiązanie od admina PostgreSQL.
zamiast null jest
nextval('wpis_id_seq')
Niezle 8O

hehe
Cytat
'nextval()' function not found

taka odp serwera.

autonumerowanie odbywa sie za pomoca typu serial i w tym polu trzeba wpisac DEFAULT i smiga smile.gif np:
  1. INSERT INTO tabela1 VALUES(
  2. DEFAULT,
  3. 'Jan',
  4. 'Kowalski'
  5. );


bynajmniej w wersji 8.1 postgresql tak jest
pozdrawiam
Sedziwoj
jeśli się nie mylę to typ serial to 'pseudo' typ, bo to samo osiągniemy przez:
  1. CREATE SEQUENCE tablename_colname_seq;
  2. CREATE TABLE tablename (
  3. colname integer DEFAULT NEXTVAL('tablename_colname_seq') NOT NULL
  4. );

A przy tworzeniu SEQUENCE mamy o wiele większe możliwości... pomijając fakt kiedy to jest naprawdę użyteczne biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.