"How to create a postgis PostGIS layer in qgis" > You could have been more clear before! It took time to me to write my first answer (deleted since).
You can have a look on that online workshop and particularly on that section.
I guess you already know the QGIS api doc!
I'm not able to reproduce this in QGIS 2.2 Windows, c3a2817.
If other versions behave differently, or if you're continuing to have this problem, you can probably set up a PostgreSQL trigger on the table as a workaround:
Using this example table:
CREATE TABLE testing (gid serial PRIMARY KEY, geom geometry(Polygon, 4326));
Here's a trigger function that will assign a new gid
where needed:
CREATE OR REPLACE FUNCTION testing_insert_trigger()
RETURNS trigger AS
$$
BEGIN
IF EXISTS (SELECT 1 FROM testing WHERE gid = NEW.gid) THEN
NEW.gid := nextval('testing_gid_seq'::regclass);
END IF;
RETURN NEW;
END;
$$ language 'plpgsql';
Binding the function to the table...
CREATE TRIGGER testing_insert
BEFORE INSERT ON testing
FOR EACH ROW EXECUTE PROCEDURE testing_insert_trigger();
This will automatically assign new IDs where the gid
already exists. For example, the following query will now duplicate all data in the table instead of failing:
INSERT INTO testing (SELECT * FROM testing);
Of course, this approach can compromise the intent of your primary key, so use it carefully.
Best Answer
The general workflow looks like this:
If you don't have a suitable PostGIS table yet, use PostGIS Manager - Create Table to start one.
Then:
(Of course you need the rights to edit the table.)