MySQL zu PostgreSQL

Hallo, ich bin ein absoluter Neuling in PostgreSQL und wende mich an Euch in der Hoffnung auf Hilfe. Ich muss ein PHP-File, das mit einer MySQL Datenbank arbeitet in PostgreSQL umschreiben. Ich hatte mich auf Empfehlung für PostgreSQL entschieden. Nun finde ich keinen Einstieg und hoffe, dass Ihr mir helfen könnt, einen Einstieg zu finden, indem Ihr mir über die ersten Fehlermeldungen helft.

Folgende Datenbankanweisung findet sich im PHP-Code:

foreach(unserialize(BACKUPTABLES) as $table) {  query('CREATE TABLE '.TABLE_PREFIX.BACKUPTABLE_PREFIX.$table.' LIKE '.TABLE_PREFIX.$table); }     

BACKUPTABLE_PREFIX wird zuvor definiert:

define('BACKUPTABLE_PREFIX','backup_'); define('BACKUPTABLES',serialize(array('attachments','polls','pollvotes','posts','threads','threadsubscriptions')));   

Ich bin Euch wirklich sehr dankbar, wenn Ihr mir helfen könntet.

Wie lautet denn die Fehlermeldung?

Andreas

Type: 20
File: (Line no. 0)
Message
SQL Error: 42601 - ERROR: syntax error at or near “LIKE”
LINE 1: CREATE TABLE mybb_backup_attachments LIKE mybb_attachments
^

Query: CREATE TABLE mybb_backup_attachments LIKE mybb_attachments

Vielen lieben Dank für Deine Antwort Andreas.
Thorsten

Vielleicht noch als Hinweis. Ich verstehe das so, dass hier versucht wird Tabellen zu erzeugen, die identisch zu bereits vorhandenen sind nur mit einem anderen Prefix.

Ich habe die Lösung gefunden. In PostgreSQL muss die Like Anweisung in Klammern geschrieben werden.

die korrekte Syntax wäre:

create table bla ( like template );

Andreas

Leider hänge ich jetzt einen Schritt weiter wieder fest. Offensichtlich geht es um die verschiednen Default Typen von MySQL und PostgreSQL.

Ich erhalte folgende Meldung:

If there is a difference between a core table and its backup table Undo Delete will not work. Here you can see what you have to modify to update your backup tables manually.

CREATE TABLE mybb_backup_attachments (
aid int4 DEFAULT nextval(‘mybb_backup_attachments_aid_seq’::regclass) NOT NULL,
pid int4 NOT NULL,
posthash varchar(50) DEFAULT ‘’::character varying NOT NULL,
uid int4 NOT NULL,
filename varchar(120) DEFAULT ‘’::character varying NOT NULL,
filetype varchar(120) DEFAULT ‘’::character varying NOT NULL,
filesize int4 NOT NULL,
attachname varchar(120) DEFAULT ‘’::character varying NOT NULL,
downloads int4 NOT NULL,
dateuploaded int8 DEFAULT (0)::bigint NOT NULL,
visible int4 NOT NULL,
thumbnail varchar(120) DEFAULT ‘’::character varying NOT NULLNULL,
CONSTRAINT mybb_backup_attachments_pkey PRIMARY KEY (aid)
)

Keine Fehlermeldung von PostgreSQL.

Ich würde z.T. andere Datentypen nehmen. Längenbegrenzte VARCHAR - Felder fallen Dir früher oder später auf die Füße, Datum (dateuploaded) würde ich als DATE oder TIMESTAMP definieren, visible als BOOL.
Bei den anderen Feldern (posthash z.B.) gäbe es möglicherweise auch bessere Lösungen.

Andreas

Darf ich Dir mal ein File zusenden, um das es geht? Es ist für MySQL geschrieben und müsste mit PostgreSQL laufen. Ich würde Dir auch den Aufwand bezahlen.

Ich mache mal schamlos Werbung: in meinem Buch (siehe Signatur) gibt es ein ganzes Kapitel zu dem Thema.
Dort werden unter anderem auch die verschiedenen Datentypen beschrieben.

Es gibt beispielsweise folgenden Replace:

$create=preg_replace(’#AUTO_INCREMENT=([0-9]+) #Usi’,’’,$create);

Ein Autoincrement gibt es in PostgreSQL nicht. Wie kann ich das in PostgreSQL umschreiben?

Hier nochmals die gesamte Stelle an der es hängt:

function undodelete_check_table($table,$hard=false,$count=false)
{
global $db;
if(!$db->table_exists(BACKUPTABLE_PREFIX.$table))
{
$db->query(‘CREATE TABLE ‘.TABLE_PREFIX.BACKUPTABLE_PREFIX.$table.’ LIKE ‘.TABLE_PREFIX.$table);
}
$create=$db->show_create_table($table);
$create=preg_replace(’#AUTO_INCREMENT=([0-9]+) #Usi’,’’,$create);
$create_backup=$db->show_create_table(BACKUPTABLE_PREFIX.$table);
$create_backup=str_replace(TABLE_PREFIX.BACKUPTABLE_PREFIX.$table,TABLE_PREFIX.$table,$create_backup);
$create_backup=preg_replace(’#AUTO_INCREMENT=([0-9]+) #Usi’,’’,$create_backup);
if($create!=$create_backup)
{
$return[]=$table;
$return[]=‘error’;
if($count)
{
$return[]=$db->num_rows($db->simple_select(BACKUPTABLE_PREFIX.$table));
}
return $return;
}
if($hard)
{
$return[]=$table;
$return[]=‘success’;
if($count)
{
$return[]=$db->num_rows($db->simple_select(BACKUPTABLE_PREFIX.$table));
}
return $return;
}
return false;
}

Nimm serial
PostgreSQL: Documentation: Manuals: PostgreSQL 9.0: Numeric Types

Das allein wird nicht helfen. Im Prinzip wird eine bestehende Datenbank kopiert. Dort wird nextval(‘mybb_posts_pid_seq’::regclass) verwendet. :frowning:

Verstehe ich nicht. autoincrement lässt sich direkt in serial “übersetzen”
Die alte DB ist doch MySQL, da gibt es doch gar sowieso kein nextval()

Aber wenn Du den Namen der Sequence kontrollieren willst, dann kannst Du diese zuerst anlegen (CREATE SEQUENCE mybb_posts_pid_seq) und dann im CREATE TABLE diese verwenden:

CREATE TABLE bla 
(
   some_id integer primary key not null default nextval('mybb_posts_pid_seq'),
   ....
)

Nein, die alte DB ist nicht MySQL. Das PHP-Script ist für MySQL geschrieben und ich versuche es auf meine PostgreSQL Db umzuschreiben. Mein Problem ist meine absolute Unkenntnis. (Siehe Source oben) :frowning: