根据标题:在 SQL Server 中,是否在插入的默认约束之前或之后应用了检查约束?
所以采用下表(为简洁起见省略了不必要的列)......
CREATE TABLE [dbo].[Customer](
[CountryCode] [varchar](5) NULL CONSTRAINT [CK_Customer_DefaultCountryCode] DEFAULT ([app].[GetUnknownCountryIsoCountryCode]()),
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
...还有以下检查约束...
ALTER TABLE [admin].[Customer] WITH CHECK
ADD CONSTRAINT [CK_CustomerHasCountryWhenIntercompanyBusinessModel]
CHECK (
([app].[BusinessModelMustHaveCountry]([BusinessModelId]) = (1) AND [app].[CheckCountryCodeExists]([CountryCode]) = (1) OR
[app].[BusinessModelMustHaveCountry]([BusinessModelId]) <> (1))
)
GO
Run Code Online (Sandbox Code Playgroud)
...是否会应用默认约束并在应用检查约束之前填充默认值?
ALTER TABLE test_table ADD COLUMN a DEFAULT NULL;
Run Code Online (Sandbox Code Playgroud)
对比
ALTER TABLE test_table ADD COLUMN a;
Run Code Online (Sandbox Code Playgroud)
NULL
如果a
未指定列,则将设置两列。
据我所知,如果我将一列添加到生产数据库中具有默认值的表中,则可能会导致用默认值重写所有行时出现问题。
是DEFAULT NULL
一样的吗?
我有下表:
CREATE TABLE orders
(
info_date date,
country_code VARCHAR,
order_total int,
CONSTRAINT orders_pk PRIMARY KEY (info_date, country_code)
) PARTITION BY LIST (country_code);
CREATE TABLE orders_def PARTITION OF orders DEFAULT;
Run Code Online (Sandbox Code Playgroud)
我插入一些行country_code
'foo'
,它们最终位于默认分区中。
一段时间后,我决定应该'foo'
有自己的分区,我该怎么做?
根据文档:
如果存在 DEFAULT 分区,并且 DEFAULT 分区中存在任何行,否则它们将适合要添加的新分区,则无法添加新分区。
这是我的尝试:
begin;
CREATE TEMP TABLE temp_table ON COMMIT DROP AS
SELECT * FROM orders where country_code = 'foo';
DELETE FROM orders where country_code = 'foo';
CREATE TABLE orders_foo PARTITION OF orders FOR VALUES IN ('foo');
INSERT INTO …
Run Code Online (Sandbox Code Playgroud) postgresql migration partitioning default-value postgresql-11
我有一个预先存在的表,其中有一列可以保存 UUID。
我希望能够定义一个默认值,以便(来自旧系统)进入的新行仍将通过该UUID()
函数获得定义的 UUID -- 是否可以将列的默认值配置为由UUID(以类似于UNIX_TIMESTAMP()
在 phpMyAdmin 中的方式)
我在 SQL 中创建了一个表类型:
CREATE TYPE [dbo].[MyObject_TableType] AS TABLE
(
[Name] VARCHAR(MAX) DEFAULT '',
[Index] VARCHAR(MAX) DEFAULT ''
)
Run Code Online (Sandbox Code Playgroud)
我构建了一个DataTable
并用一个填充它DataRow
。我将该表作为参数提供给存储过程:
// Set up connection and command variables (code omitted)
// ...
// Make the data table
var table = new DataTable();
table.Columns.Add("Name");
table.Columns.Add("Index");
// Add one row that is missing an Index
var row = table.NewRow();
row["Name"] = "ObjectOne";
table.Rows.Add(row);
// Make a parameter for the table
var tableParameter = new SqlParameter("MyObjects", SqlDbType.Structured)
{
TypeName = "MyObject_TableType", …
Run Code Online (Sandbox Code Playgroud) sql-server default-value c# user-defined-table-type table-valued-parameters
我如何有 2 列的默认值不正确。当我从另一个来源导入数据库时,不确定它是如何首先创建的。
现在的问题是,我无法对表进行任何更改,因为 MYSQL 会抱怨:
MySQL 说:“campaign_start_date”的默认值无效
如果我尝试添加一列。
但是当我尝试将DEFAULT VALUE
to更改为CURRENT_TIMESTAMP
for 时campaign_start_date
,它抱怨campaign_end_date
有一个无效的默认值。
所以我陷入了一个循环,不允许我对表进行任何更改。
有没有什么办法解决这一问题?
我正在使用 MS SQL Server。我有一个带有“action_type”列的“action”表,我想为其设置默认值“to do”。我在 MS SQL Studio 中的 DDL 错误!我已经阅读了许多文章,试图找出我做错了什么,但似乎没有任何效果。DDL如下,表CREATE有效,ALTER失败。
CREATE TABLE "action"
( "action" INT IDENTITY(1,1)
, "name" VARCHAR(250) NOT NULL
, "owner" VARCHAR(50)
, "action_type" VARCHAR(50) NOT NULL
, "due_date" DATETIME
, "done_date" DATETIME
, "successful" BIT NOT NULL
, "job" INT
, "contract" INT
, "person" INT
, "description" VARCHAR(MAX)
, "deliverable" VARCHAR(MAX)
, "outcome" VARCHAR(MAX)
, "source" VARCHAR(50)
, "notes" VARCHAR(MAX)
);
ALTER TABLE "action"
ADD CONSTRAINT "df_action_0" DEFAULT "To Do" FOR "action_type";
Run Code Online (Sandbox Code Playgroud)
ALTER 语句返回错误 …
我在 MySQL 5.7 表中创建了一个created_time
字段BIGINT
,现在我想在插入记录时自动生成一个 Unix 毫秒时间戳。是否有可能做到这一点?我尝试了下面的代码,但失败了:
ALTER TABLE db.video_info MODIFY COLUMN created_time bigint(20)
DEFAULT (ROUND(UNIX_TIMESTAMP(CURTIME(4)) * 1000)) NULL;
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用虚拟数据生成虚拟表,以测试某些 SQL 任务的性能。
基于这个旧线程:有没有办法将多行插入到所有列都有默认值的表中?
我注意到,对于类型IDENTITY
,不再可能使用建议的generate_series(1, N)
解决方案用虚拟数据填充表。
那么,如何将 1'000 个虚拟数据插入到下表 (PG 14) 中,从而利用字段的默认值name
而不覆盖字段的系统值id
:
CREATE TABLE foo (
id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
name TEXT DEFAULT md5(random()::text)
);
Run Code Online (Sandbox Code Playgroud)
尝试以下操作失败:
INSERT INTO foo (id)
SELECT generate_series(1, 1000);
-- which results in:
ERROR: cannot insert a non-DEFAULT value into column "id"
DETAIL: Column "id" is an identity column defined as GENERATED ALWAYS.
HINT: Use OVERRIDING SYSTEM VALUE to override.
SQL state: 428C9 …
Run Code Online (Sandbox Code Playgroud) 我知道我可以像这样使用当前时间戳设置默认值
... DEFAULT CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)
有没有办法根据当前时间戳设置具有固定单位数量的列?
... DEFAULT CURRENT_TIMESTAMP + 10 days?
Run Code Online (Sandbox Code Playgroud) default-value ×10
mysql ×4
postgresql ×3
sql-server ×3
alter-table ×2
constraint ×2
timestamp ×2
c# ×1
datatypes ×1
migration ×1
mysql-5 ×1
partitioning ×1
phpmyadmin ×1