modl icon indicating copy to clipboard operation
modl copied to clipboard

Columns in create table default to nullable

Open japettyjohn opened this issue 10 years ago • 2 comments

Column definitions should be non-nullable for native non pointer types.

When creating new tables the columns for non-pointer types are nullable in the database (at least for MariaDB). In the case that inserts/updates only goes through the API this is can be negated in terms a data integrity issue - but this cannot be guaranteed and it will certainly cause problems with the API to assign nulls to non-nilable fields.

From the performance end it may be implementation specific but mysql is faster with non-nullable columns (http://stackoverflow.com/questions/471367/when-to-use-null-in-mysql-tables).

This is addressed in the createTable of https://github.com/jmoiron/modl/blob/master/dbmap.go#L180 and is dependant on the ColumnMap here https://github.com/jmoiron/modl/blob/master/tablemap.go#L295 .

japettyjohn avatar Feb 10 '15 20:02 japettyjohn

I also would prefer that a non-pointer type is not nullable by default. This makes sense for data integrity.

However there is a counter-example with the Null* types in database/sql (e.g. NullString, NullBool, etc). These are not pointers but are clearly nullable.

There are two possible solutions:

  1. If a field is not a pointer type, AND it does not implement sql.Scanner, then it should default to "not null" in the create table statement. Such a field will not correctly handle a null value anyway.
  2. Provide an option on ColumnMap, something like columnMap.SetNullable(false). Then I can do whatever I want regardless.

I think both solutions should be done.


Currently I am just using columnMap.SetSqlCreate() and specifying it all manually.

chowey avatar Aug 16 '15 02:08 chowey

I've addressed this and the dialects additionally regarding ptrs etc. in #42.

japettyjohn avatar Jan 16 '16 23:01 japettyjohn