DanielBB
23.07.2003, 14:00:03
Jak zrobić autonumerowanie w Postgre przy zakładaniu tabeli?
Z góry dzięki.
kurtz
23.07.2003, 15:02:19
Hej
Cytat
Jak zrobić autonumerowanie w Postgre przy zakładaniu tabeli?
http://pgsql.spsk1.pl/postgresql-faq.html i odpoweidz nr 16 ;)
Pozdrawiam
DanielBB
23.07.2003, 16:30:07
Wielkie dzieki. Czy do zinicjowania trzeba wpisać wartość początkową id?
KaMeLeOn
23.07.2003, 16:33:59
Cytat
Wielkie dzieki. Czy do zinicjowania trzeba wpisać wartość początkową id?
Nie trzeba...
DanielBB
23.07.2003, 16:56:58
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
23.07.2003, 17:01:43
Popraw znaczniki BBCode.
DanielBB
24.07.2003, 09:04:01
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
24.07.2003, 09:11:56
Cytat
[php:1:7124ae4438]
$query = "INSERT INTO wpis VALUES(null, '$autor', '$text', ";
[/php:1:7124ae4438]
Czy faktycznie masz przecinek na koncu zapytania sql??
DanielBB
24.07.2003, 11:29:42
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
24.07.2003, 13:44:07
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
24.07.2003, 16:04:45
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
24.07.2003, 21:05:38
Panowie dostałem na skrzynkę rozwiązanie od admina PostgreSQL.
zamiast null jest
nextval('wpis_id_seq')
Niezle 8O
Pozdrawiam
jezoo
29.11.2006, 13:49:52
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

np:
INSERT INTO tabela1 VALUES(
DEFAULT,
'Jan',
'Kowalski'
);
bynajmniej w wersji 8.1 postgresql tak jest
pozdrawiam
Sedziwoj
4.12.2006, 23:26:02
jeśli się nie mylę to typ serial to 'pseudo' typ, bo to samo osiągniemy przez:
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
colname integer DEFAULT NEXTVAL('tablename_colname_seq') NOT NULL
);
A przy tworzeniu SEQUENCE mamy o wiele większe możliwości... pomijając fakt kiedy to jest naprawdę użyteczne
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.