Reset a column to its default value with GORM - go-gorm

Is there a way in GORM to reset a column to its default value? MySql provides the DEFAULT keyword for this
UPDATE table SET col = DEFAULT WHERE id = 123
There is no mention of updating a column to its default value in the GORM Update documentation. Should the Raw SQL Builder be used for this?

Have you tried with tags?
My Idea is set DEFAULT tag and set value as null and update it. like this:
type Table struct {
// other fields
Number `sql:"DEFAULT:0"`
}
modelTable := Table{}
// jobs and insert
// get model and prepare then update Number
modelTable.Number = null.IntFromPtr(nil)
modelTable.Update()
for create null use null package.
If this doesnt work then you should use Raw sql.

Related

How to create default constraint on the table of Firebird to assign auto-generated UUID value

I am trying to define a table with a column type of UUID (CHAR(16) CHARACTER SET OCTETS). After reading through the Firebird 3.0 Developer's Guide, I found only context-variables/simple expression/constant are supported. I would like to know if there is a way to define a default constraint on a table to call GEN_UUID() to assign UUID for insertion?
You cannot do this with a DEFAULT clause, as that only allows literals and a select number of what the Firebird documentation refers to as 'context variables'.
To do what you want, you need to create a before insert trigger to generate the value. Something like this:
create trigger bi_yourtable before insert on yourtable
as
begin
new.uuid_column = gen_uuid();
end
Or, if you don't want unconditional generation of the UUID:
create trigger bi_yourtable before insert on yourtable
as
begin
if (new.uuid_column is null) then
begin
new.uuid_column = gen_uuid();
end
end

Liquibase sets DEFAULT 0 for BIT

I add the following column in a table:
alter table my_table
add no_default bit null;
When I let Liquibase make a diff, it generates the following change:
ALTER TABLE my_table ADD no_default BIT DEFAULT 0 NULL;
As you see, it sets false (0) as default value although the column does not define it.
Is this an error or is there a way to prevent this?
// Edit: I am using a MariaDB 10.2 database.

Snowflake: Trying to make a column to use as default the value from a sequence

So, I have something like this:
CREATE OR REPLACE TABLE TABLE_NAME (
ID NUMBER(38, 0) NOT NULL,
/* OTher elements */
)
With some values already (manually) inserted. I need to update this table so, for future inserts, the value of ID is taken from a sequence I just created:
CREATE OR REPLACE SEQUENCE S_TABLE_NAME_ID
START WITH 451;
For what I've seen in the documentation and in several forums, the syntax should be like this:
ALTER TABLE TABLE_NAME ALTER ID SET DEFAULT S_TABLE_NAME_ID.NEXTVAL;
But when I try to execute it, I get the following error message:
SQL Error [2] [0A000]: Unsupported feature 'Alter Column Set Default'.
Am I missing here something?
from Snowflake Doc (https://docs.snowflake.com/en/sql-reference/sql/alter-table-column.html):
"To change the default sequence for a column, the column must already
have a default sequence. You cannot use the command ALTER TABLE ...
SET DEFAULT <seq_name> to add a sequence to a column that does not
already have a sequence."
So I guess you have to set the sequence as column default when creating the table.

Insert statement with a NON-NULLABLE column

I have a SQL Server script that I'm using to insert some data into a database. I won't upload the whole script here just for space/time savings sake, but I will include the important bits.
So here is the problem. I have a table that has a column for some loginhtml, this column is of a non-nullable type. I would like for this column to be left blank on this particular add so it can default back to the parent that I'm pointing it at. So here we have the declaration for this important portion:
declare #loginTitle varchar(250), #loginHtml varchar(max)
And here we have what it will be set to:
set #loginHtml = null
And here is the insert part that is inevitably going to fail:
insert dbo.ApplicationLogin(ApplicationID, Title, Html)
select #appID, #loginTitle, #loginHtml
EDIT: How can I have this script "default" the loginhtml column to whatever the PARENT Application is? Is there some "IF" statement/clause that can be used to accomplish this?
As long as the column in non null, then you can't insert a null value into it. You could try setting it to a blank string or other default value. You could aslo select the parent's html and insert that instead. There is no way to skip over inserting any column.
As others have stated, if there is a Not Null constraint on the column, you are out of luck, but you could do
if #loginhtml is null
begin
set #loginhtml = ''
end
Or change
set #loginhtml = ''
to lookup whatever the default in the parent application is.
and you will write a blank instead of anything. You, obviously, run into whatever issues there will be with having no loginhtml, but if that's what you want that is what you want!
You can adjust your script:
insert dbo.ApplicationLogin(ApplicationID, Title, Html)
select #appID, #loginTitle, ISNULL(#loginHtml, '')
Or adjust your table and add a default constraint:
ALTER TABLE ApplicationLogin ADD DEFAULT (('')) FOR [Html];
I may not have mentioned this in the initial post, and I would like to apologize for that. But the way the database is set up, is applications can have parent applications, so setting the loginhtml to the parent application and "technically" skipping adding it to the new application can be done by doing this:
if(#loginHtml is not null)
begin
insert dbo.ApplicationLogin(ApplicationID, Title, Html)
select #appID, #loginTitle, #loginHtml
end
This runs successfully and makes the "#loginhtml" default to whatever the parent application has set for that value.

Creating a sequence on an existing table

How can I create a sequence on a table so that it goes from 0 -> Max value?
I've tried using the following SQL code, but it does not insert any values into the table that I am using:
CREATE SEQUENCE rid_seq;
ALTER TABLE test ADD COLUMN rid INTEGER;
ALTER TABLE test ALTER COLUMN rid SET DEFAULT nextval('rid_seq');
The table I am trying to insert the sequence in is the output from another query. I can't figure out if it makes more sense to add the sequence during this initial query, or to add the sequence to the table after the query is performed.
Set the default value when you add the new column:
create sequence rid_seq;
alter table test add column rid integer default nextval('rid_seq');
Altering the default value for existing columns does not change existing data because the database has no way of knowing which values should be changed; there is no "this column has the default value" flag on column values, there's just the default value (originally NULL since you didn't specify anything else) and the current value (also NULL) but way to tell the difference between "NULL because it is the default" and "NULL because it was explicitly set to NULL". So, when you do it in two steps:
Add column.
Change default value.
PostgreSQL won't apply the default value to the column you just added. However, if you add the column and supply the default value at the same time then PostgreSQL does know which rows have the default value (all of them) so it can supply values as the column is added.
By the way, you probably want a NOT NULL on that column too:
create sequence rid_seq;
alter table test add column rid integer not null default nextval('rid_seq');
And, as a_horse_with_no_name notes, if you only intend to use rid_seq for your test.rid column then you might want to set its owner column to test.rid so that the sequence will be dropped if the column is removed:
alter sequence rid_seq owned by test.rid;
In PostgreSQL:
UPDATE your_table SET your_column = nextval('your_sequence')
WHERE your_column IS NULL;
I'm not fluent in postgresql so I'm not familiar with the "CREATE SEQUENCE" statement. I would think, though, that you're adding the column definition correctly. However, adding the column doesn't automatically insert data for existing rows. A DEFAULT constraint is for new rows. Try adding something like this afterwards to populate data on the existing rows.
DECLARE #i Int
SET #i = 0
SET ROWCOUNT 1
WHILE EXISTS (SELECT 1 FROM test WHERE rid IS NULL) BEGIN
UPDATE test SET rid = #i WHERE rid IS NULL
END
SET ROWCOUNT 0