Can I set mysql date default value to empty value? - mysql

I have a mysql table contains a Nullable date column with NULL as it's default value. I've tried to import 5000 rows data from a csv file which most of it's date values are empty. But those empty values became '0000-00-00' after imported to my mysql table.
Can I set the default value of that table column to an empty value? Something like '' instead of '0000-00-00'.

Related

Mysql Date Default insert in 1970-01-01

I am inserting an empty date-field, but a default value 1970-01-01 gets inserted automatically. Why?
I even changed the Date structure to allow null, set Default as Null, still it's inserting 1970-01-01.
It's the default behavior of MySQL, check in the Database that the field can be NULL.
Check this: old post
You are most likely inserting an empty string. Inserting an entry string will result in 1970-01-01 being written instead. You have to really insert NULL if you don't want this to happen.
What you want to do is:
INSERT INTO table
SET datefield = NULL
Not "NULL" but NULL Otherwise it will read it as a string and not as NULL
You can also just don't set the column at all in your insert and than it will use NULL as well

Mysql auto-initialization of timestamp column when adding it to an existent table

I want to add a column to a table to keep track of when each record was last updated. I already have some data in the table.
The SQL query I am running is this:
ALTER TABLE `my_table` ADD COLUMN `last_modified` timestamp NOT NULL
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP`;
When adding columns of other types existent records get the default value I specify for that column. However in this case all existent records are getting assigned the value of: 0000-00-00 00:00:00
Why is this happening if I explicitly said I wanted the default to be the current timestamp?

MySQL can distinguish NULL and ""(null character string)

I set default value in a field NOT NULL.
The sql is as follows.
insert into table_name () values ()
I expected this sql should be rejected by MySQL as a field restricts NULL.
But, the field had a value ""(null character string).
Then, I tried another sql.
insert into table_name (name) values (NULL)
As this sql was rejected, no value was inserted.
MySQL seems to distinguish NULL and "". Do I have to avoid first sql such as "values ()"?
For a good practice always make the column as not null and set a default value whenever you create a table.
At insert time if you do not provide a value, the column will then be assigned the default value.
Do I have to set default value in a field that is set as NOT NULL?
YES if you are doing an INSERT where in you will not set any values to the NOT NULL columns
and
NO not needed anymore, if you are providing a value on the columns that are NOT NULL on INSERT.
You can refer to this
http://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html

What is the default value for a field if no default value is provided?

I hope this isn't a dumb question. You can set a default value for all variables or a function for when it is inserted. but if the field is not required to insert and you don't allow null values, what is the "blank" value that you see in phpMyAdmin? in a query is it returned as empty string, etc?
just trying to figure it out, I want to query for all records such that the value for a specific column in that record is not "empty" or blank or whatever.
thanks.
Referring to the manual,
For data entry for a NOT NULL column that has no explicit DEFAULT
clause, if an INSERT or REPLACE statement includes no value for the
column, or an UPDATE statement sets the column to NULL, MySQL handles
the column according to the SQL mode in effect at the time:
If strict SQL mode is not enabled, MySQL sets the column to the implicit default value for the column data type.
If strict mode is enabled, an error occurs for transactional tables and the statement is rolled back. For nontransactional tables, an
error occurs, but if this happens for the second or subsequent row of
a multiple-row statement, the preceding rows will have been inserted.
So your question now may be, what are the implicit default values for the various column data types? Here you go:
Implicit defaults are defined as follows:
For numeric types, the default is 0, with the exception that for integer or floating-point types declared with the AUTO_INCREMENT
attribute, the default is the next value in the sequence.
For date and time types other than TIMESTAMP, the default is the appropriate “zero” value for the type. For the first TIMESTAMP column
in a table, the default value is the current date and time. See Section 10.3, “Date and Time Types”.
For string types other than ENUM, the default value is the empty string. For ENUM, the default is the first enumeration value.
There IS no default value unless you specify one (i.e. unless you define a "default constraint" for the column in question).
Here's an example for adding a default on an existing column:
ALTER TABLE dbo.customer ALTER COLUMN contactname SET DEFAULT 'Unknown'
Here's an example creating the table with a default:
CREATE TABLE Books (
ID SMALLINT NOT NULL,
Name VARCHAR(40) NOT NULL,
PubID SMALLINT NOT NULL DEFAULT 0
)
It's good practice to declare ALL columns "not null", and provide default constraints as appropriate.
In the "books" example above, if you "insert" without specifying PubID, the PubID will be zero.
In the same example, if you "insert" without specifying ID or Name ... you'll get an error.
If you want MySQL to auto-assign an ID, use this syntax instead:
CREATE TABLE Books (
ID SMALLINT NOT NULL AUTO_INCREMENT,
Name VARCHAR(40) NOT NULL,
PubID SMALLINT NOT NULL DEFAULT 0
)
If you want to disallow null :-
alter table YOUR_TABLE modify column COLUMN varchar(255) not null default '';
The above query will disallow null and assign an empty string when the value is not supplied.
In phpmysqladmin, blank = empty.
Via PHP mysqli function or mysql function, null value is returned as null still.
Once you have apply the query, you can easily filter that by using
select ... from YOUR_TABLE
where COLUMN != ""; <-- no need to check is null
<-- because the first query already enforce not null
However, is best for you do this before perform the alter :-
update YOUR_TABLE set COLUMN = ""
where COLUMN is null;

mysql timestamp column

Is it possible to define a timestamp column in a MySQL table that will automatically be updated every time a field in the same row is modified? Ideally this column should initially be set to the time a row was inserted.
Cheers,
Don
You can use the timestamp column as other posters mentioned. Here is the SQL you can use to add the column in:
ALTER TABLE `table1` ADD `lastUpdated` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ;
This adds a column called 'lastUpdated' with a default value of the current date/time. When that record is updated (lets say 5 minutes later) that timestamp will automatically update to the current time.
That is the default functionality of the timestamp column type. However, note that the format of this type is yyyymmddhhmmss (all digits, no colons or other separation).
EDIT: The above comment about the format is only true for versions of MySQL < 4.1... Later versions format it like a DateTime
This is what I have observed (MySql 5.7.11) -
The first TIMESTAMP column in the table gets current timestamp as the default value. So, if you do an INSERT or UPDATE without supplying a value, the column will get the current timestamp.
Any subsequent TIMESTAMP columns should have a default value explicitly defined. If you have two TIMESTAMP columns and if you don't specify a default value for the second column, you will get this error while trying to create the table -
ERROR 1067 (42000): Invalid default value for 'COLUMN_NAME'
A MySQL timestamp is set with creation or update time only if their default value is set as it. ALTER TABLE some_table ADD when TIMESTAMP DEFAULT CURRENT_TIMESTAMP.
Otherwise it works just like a DateTime field, only that it's relative to 1970/01/01 UTC, so it's an absolute point in time not depending on a specific timezone as is DateTime.