使用在列前面定义的随机值INSERT值

时间:2014-08-12 10:13:20

标签: sql sql-server insert default

我们如何插入默认值,如下所示?

INSERT INTO table1 (name, number = rand())
VALUES ('name1'), ('name2'), ('name3'), ('name4')

3 个答案:

答案 0 :(得分:1)

您可以更改/添加现有的default约束,如果只是暂时的话,可能会在之后还原它:

ALTER TABLE table1 ADD CONSTRAINT def_number DEFAULT ABS(CHECKSUM(NewId())) FOR number;

现在您可以像这样插入

INSERT INTO table1 (name)
VALUES ('name1'), ('name2'), ('name3'), ('name4')

例如,这个

drop table table1;
create table table1 (name varchar(50), number int);
alter table table1 add constraint def_number default abs(checksum(newid())) for number;
insert into table1 (name) values ('name1'), ('name2'), ('name3'), ('name4');
select * from table1;

将产生

enter image description here

答案 1 :(得分:1)

目前还不清楚您遇到问题的哪个方面有问题,以及“默认”值是否表示SQL Server使用该术语的特定方式为“默认”。

假设您在四个插入的行上需要四个不同的随机数值,那么最简单的方法就是四个单独的insert语句。就个人而言,我更喜欢insert . . . select语法insert . . . values,因为它更灵活:

INSERT INTO table (name, number)
    SELECT 'name1', rand();

INSERT INTO table (name, number)
    SELECT 'name2', rand();

INSERT INTO table (name, number)
    SELECT 'name3', rand();

INSERT INTO table (name, number)
    SELECT 'name4', rand();

在SQL Server中,如果将这些语句放入一个语句中,rand()只会被评估一次,因此所有四行都将获得相同的值。一种典型的方法是使用checksum(newid())rand(checksum(newid()))生成随机数。如果是这样,这将有效:

INSERT INTO table (name, number)
    SELECT 'name1', rand(checksum(newid())) UNION ALL
    SELECT 'name2', rand(checksum(newid())) UNION ALL
    SELECT 'name3', rand(checksum(newid())) UNION ALL
    SELECT 'name4', rand(checksum(newid()));

您还可以使用类似的逻辑为列设置默认值。如果您希望将“随机”数字绑定到名称,则可以在表达式中使用:name而不是newid()

答案 2 :(得分:-1)

INSERT INTO demoSO (NAME, number)
VALUES ('name1',RAND()), ('name2',RAND()), ('name3',RAND()), ('name4',RAND())