Thread: Query in SQL statement
Am trying to port a mysql statement to postgres. Please help me in finding the error in this, CREATE SEQUENCE ai_id; CREATE TABLE badusers ( id int DEFAULT nextval('ai_id') NOT NULL, UserName varchar(30), Date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, Reason varchar(200), Admin varchar(30) DEFAULT '-', PRIMARY KEY (id), KEY UserName (UserName), KEY Date (Date) ); Am always getting foll. Errors, ERROR: relation "ai_id" already exists ERROR: syntax error at or near "(" at character 240 Thanks, Rajesh R
I think this question may be more appropriate for pgsql-novice@postgresql.org. Anyrate for the below. Sounds like you maybe already have a table or sequence called ai_id; Try doing a DROP SEQUENCE ai_id; First Also if you plan to use this sequence only for this table it would be better to use serial8 which will automatically create the sequence for you. Then you don't even need that first part. Also you should avoid naming fields things like Date which tend to be keywords in many kinds of databases. Try changing your logic to something like CREATE TABLE badusers ( id serial8, UserName varchar(30), Date timestamp DEFAULT now() NOT NULL, Reason varchar(200), Admin varchar(30) DEFAULT '-', PRIMARY KEY (id) ); CREATE INDEX badusers_username ON badusers USING btree (username); CREATE INDEX badusers_date ON badusers USING btree (date); -----Original Message----- From: R, Rajesh (STSD) [mailto:rajesh.r2@hp.com] Sent: Thursday, September 29, 2005 9:05 AM To: pgsql-hackers@postgresql.org; pgsql-performance@postgresql.org Subject: [HACKERS] Query in SQL statement Am trying to port a mysql statement to postgres. Please help me in finding the error in this, CREATE SEQUENCE ai_id; CREATE TABLE badusers ( id int DEFAULT nextval('ai_id') NOT NULL, UserName varchar(30), Date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, Reason varchar(200), Admin varchar(30) DEFAULT '-', PRIMARY KEY (id), KEY UserName (UserName), KEY Date (Date) ); Am always getting foll. Errors, ERROR: relation "ai_id" already exists ERROR: syntax error at or near "(" at character 240 Thanks, Rajesh R ---------------------------(end of broadcast)--------------------------- TIP 1: if posting/reading through Usenet, please send an appropriate subscribe-nomail command to majordomo@postgresql.org so that your message can get through to the mailing list cleanly
> CREATE SEQUENCE ai_id; > CREATE TABLE badusers ( > id int DEFAULT nextval('ai_id') NOT NULL, > UserName varchar(30), > Date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, > Reason varchar(200), > Admin varchar(30) DEFAULT '-', > PRIMARY KEY (id), > KEY UserName (UserName), > KEY Date (Date) > ); > > > Am always getting foll. Errors, > > ERROR: relation "ai_id" already exists > ERROR: syntax error at or near "(" at character 240 You have just copied the Mysql code to Postgresql. It will in no way work. Your default for 'Date' is illegal in postgresql and hence it must allow NULLs. There is no such thing as a 'datetime' type. There is no such thing as 'Key'. Also your mixed case identifiers won't be preserved. You want: CREATE TABLE badusers ( id SERIAL PRIMARY KEY, UserName varchar(30), Date timestamp, Reason varchar(200), Admin varchar(30) DEFAULT '-' ); CREATE INDEX UserName_Idx ON badusers(Username); CREATE INDEX Date_Idx ON badusers(Date);
On Thu, Sep 29, 2005 at 09:28:38PM +0800, Christopher Kings-Lynne wrote: > > >CREATE SEQUENCE ai_id; > >CREATE TABLE badusers ( > > id int DEFAULT nextval('ai_id') NOT NULL, > > UserName varchar(30), > > Date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, > > Reason varchar(200), > > Admin varchar(30) DEFAULT '-', > > PRIMARY KEY (id), > > KEY UserName (UserName), > > KEY Date (Date) > >); > > > > > >Am always getting foll. Errors, > > > >ERROR: relation "ai_id" already exists > >ERROR: syntax error at or near "(" at character 240 > > You have just copied the Mysql code to Postgresql. It will in no way > work. Your default for 'Date' is illegal in postgresql and hence it > must allow NULLs. There is no such thing as a 'datetime' type. There > is no such thing as 'Key'. Also your mixed case identifiers won't be > preserved. You want: > > CREATE TABLE badusers ( > id SERIAL PRIMARY KEY, > UserName varchar(30), > Date timestamp, > Reason varchar(200), > Admin varchar(30) DEFAULT '-' > ); > > CREATE INDEX UserName_Idx ON badusers(Username); > CREATE INDEX Date_Idx ON badusers(Date); Actually, to preserve the case you can wrap everything in quotes: CREATE ... "UserName" varchar(30) Of course that means that now you have to do that in every statement that uses that field, too... SELECT username FROM badusers ERROR SELECT "UserName" FROM badusers bad user I suggest ditching the CamelCase and going with underline_seperators. I'd also not use the bareword id, instead using bad_user_id. And I'd name the table bad_user. But that's just me. :) -- Jim C. Nasby, Sr. Engineering Consultant jnasby@pervasive.com Pervasive Software http://pervasive.com work: 512-231-6117 vcard: http://jim.nasby.net/pervasive.vcf cell: 512-569-9461
R, Rajesh (STSD) wrote: > > Am trying to port a mysql statement to postgres. > > Please help me in finding the error in this, Can I recommend the reference section of the manuals for this sort of thing? There is an excellent section detailing the valid SQL for the CREATE TABLE command. Also - the pgsql-hackers list is for discussion of database development, and the performance list is for performance problems. This would be better posted on pgsql-general or -sql or -novice. > CREATE SEQUENCE ai_id; This line is causing the first error: > ERROR: relation "ai_id" already exists That's because you've already successfully created the sequence, so it already exists. Either drop it and recreate it, or stop trying to recreate it. > CREATE TABLE badusers ( > id int DEFAULT nextval('ai_id') NOT NULL, > UserName varchar(30), > Date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, Well, "Date" is a type-name, "datetime" isn't and even if it was "0000-00-00" isn't a valid date is it? > Reason varchar(200), > Admin varchar(30) DEFAULT '-', > PRIMARY KEY (id), > KEY UserName (UserName), > KEY Date (Date) The word "KEY" isn't valid here either - are you trying to define an index? If so, see the "CREATE INDEX" section of the SQL reference. http://www.postgresql.org/docs/8.0/static/sql-commands.html If you reply to this message, please remove the pgsql-hackers CC: -- Richard Huxton Archonet Ltd