To discover more intermediate courses and gain hands-on experience in SQL, register to DataCamp's Intermediate SQL tutorial. Learn Data Science by completing interactive coding challenges and watching videos by expert instructors. Start Now!

Inserting rows


Once a table has been created, you can populate it with data using the INSERT command.

Here is the syntax:

INSERT INTO table_name (column1, column2)
VALUES (value11, value12), (value21, value22), (value31, value32), ...

The first clause after the INSERT INTO statement specifies the columns which will be part of the insert statement. Each row to insert will specify the set of columns defined by the first clause, and in the same order. Any other column which was not specified in the first clause will receive the default value. If a NOT NULL column was defined in the table and the INSERT INTO statement missed the column, the INSERT command will fail to run.

On an INSERT, if the INTEGER PRIMARY KEY column is not explicitly given a value, then it will be filled automatically with an unused integer, usually the next number currently in use in the column. This is true regardless of whether or not the AUTOINCREMENT keyword is used.

If the columns clause that specifies the list of columns is omitted, then the assumption is that all columns will be provided in the INSERT statement:

INSERT INTO table_name VALUES (value1, value2, value3, value4...);

If one of the values is missing then the INSERT statement will simply fail, unless the query can figure out which fields can be set to their default value. In general, this method of inserting is never recommended because the database structure changes the meaning of the query, which can be very dangerous.

Note that it is much much more efficient to insert values in bulk using one query, and not several new INSERT statments for each row because of the communication with the database. If you need to take performance into consideration, keep this in mind.

Here are some examples of an INSERT query in action:

CREATE TABLE customers (first_name NOT NULL, last_name NOT NULL, age);
INSERT INTO customers (first_name, last_name, age) VALUES ("John", "Doe", 23);
SELECT * FROM customers;

Now let's see what happens if we omit the columns list:

CREATE TABLE customers (first_name NOT NULL, last_name NOT NULL, age);
INSERT INTO customers VALUES ("John", "Doe", 23);
SELECT * FROM customers;

Let's remove the age - this will cause the query to fail:

CREATE TABLE customers (first_name NOT NULL, last_name NOT NULL, age);
INSERT INTO customers VALUES ("John", "Doe");
SELECT * FROM customers;

Let's add more people:

CREATE TABLE customers (first_name NOT NULL, last_name NOT NULL, age);

INSERT INTO customers (first_name, last_name, age)
VALUES ("John", "Doe", 23), ("Eric", "Smith", 26);

SELECT * FROM customers;

Replacing and ignoring

SQLite supports three additional types of syntax to insert data: INSERT OR REPLACE, REPLACE INTO and INSERT OR IGNORE.

The REPLACE statement means that if you are inserting an already existing row (meaning, a primary key which already exists in the table) then the INSERT statement will not fail and would actually delete the old row and insert the new one instead. REPLACE would fail if that row doesn't exist whereas INSERT OR REPLACE will always work and will either insert a new row or replace an existing one.

INSERT OR IGNORE is similar to INSERT OR REPLACE but would actually completely ignore the INSERT command for the specific row that already exists in the database. This is useful when inserting a bulk of data which some of it (or its primary keys) may already exist.

Exercise

Insert "John Snow" into the database. John is 33 years old.


Copyright © learnsqlonline.org. Read our Terms of Use and Privacy Policy