我正在插入带有自动增量键字段的SQLServer表.(我相信这在SQLServer中称为IDENTITY列.)
在Oracle中,我可以使用RETURNING关键字为我的INSERT语句提供一个结果集,就像SELECT查询一样,它将返回生成的值:
INSERT INTO table
(foreign_key1, value)
VALUES
(9, 'text')
RETURNING key_field INTO :var;
Run Code Online (Sandbox Code Playgroud)
如何在SQLServer中完成此操作?
额外奖励:好的,到目前为止答案很好,但如果可能的话,如何将其写入单一陈述?:)
没有序列和触发器,没有简单的方法可以做到这一点吗?我有平均的SQL技能,我想使用pl/sql(PostgreSQL)的行业标准方法.我基本上是从Spring Security转换这个示例表:
create table group_members (
id bigint generated by default as identity(start with 0) primary key,
username varchar(50) not null,
group_id bigint not null,
constraint fk_group_members_group foreign key(group_id) references groups(id));
Run Code Online (Sandbox Code Playgroud)
到目前为止我所拥有的:
CREATE TABLE auth_group_members (
id NUMBER,
username VARCHAR(50) NOT NULL,
group_id NUMBER NOT NULL,
CONSTRAINT "FK_AuthGroupMembers" FOREIGN KEY(group_id) REFERENCES auth_groups(id)
);
Run Code Online (Sandbox Code Playgroud) 运行了很长时间后,我在id字段中得到越来越多的漏洞.一些表的id是int32,id序列达到了它的最大值.一些Java源代码是只读的,因此我不能简单地将id列类型更改为int32to long,这会破坏API.
我想重新编号.这可能不是一个好的做法,但好或坏并不关心这个问题.我想重新编号,特别是那些很长的ID,如"61789238","548273826529524324".我不知道它们为什么这么长,但更短的ID也更容易手动处理.
但由于引用和约束,手动压缩ID并不容易.
PostgreSQL本身是否支持ID重新编号?或者是否有任何插件或维护工具?
也许我可以写一些存储过程?那将是非常好的,所以我可以每年安排一次.
我正在网站上工作,允许人们在线创建个人资料.我想知道使用MySQL AUTO_INCREMENTed ID作为我的用户ID 是否是正确的选择.还要记住,有一天我可能不得不跨多个服务器复制数据库?
例如,你会在Twitter或Facebook这样的网站上对userIds使用这种方法吗?
我之前尝试用PHP生成userIds.我使用过这样的东西:
function generateID() {
$possible = "1234567890";
$code = "";
$characters = mt_rand(7,14);
$i = 0;
while ($i < $characters) {
$code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
$i++;
}
return $code;
}
Run Code Online (Sandbox Code Playgroud)
这给出了我需要的值类型,但是我总是必须从DB检查该ID是否还不存在.
有没有更好的方法?
我正在使用C#中的一个对象,我需要对象的每个实例都有一个唯一的id.我对此的解决方案只是放置一个成员变量,我在类中和我将拥有的构造函数中调用idCount:
objectID = idCount;
idCount++;
Run Code Online (Sandbox Code Playgroud)
我认为这可以解决我的问题,但似乎idCount永远不会增加,即使构造函数被多次调用.例如,如果idCount = 1,则所有对象的objectID仍为1.为什么idCount ++不起作用?
任何帮助,将不胜感激.抱歉,如果我的解释不充分,我不确定如何解释它.
我有这个简单的表(仅用于测试):
create table table
(
key int not null primary key auto_increment,
name varchar(30)
);
Run Code Online (Sandbox Code Playgroud)
然后我执行以下请求:
insert into table values ( null , 'one');// key=1
insert into table values ( null , 'two');// key=2
Run Code Online (Sandbox Code Playgroud)
在这个阶段一切顺利,然后关闭H2控制台并重新打开它并重新执行此请求:
insert into table values ( null , 'three');// key=33
Run Code Online (Sandbox Code Playgroud)
最后,这是所有结果:

我不知道如何解决这个问题,如果这是一个真正的问题...等待作者的回复......
Instagram的Postgres为Sharding实现自定义ID的方法很棒,但我需要在MySQL中实现.
所以,我转换了这个博客底部的方法,在这里:http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram
MySQL版本:
CREATE TRIGGER shard_insert BEFORE INSERT ON tablename
FOR EACH ROW BEGIN
DECLARE seq_id BIGINT;
DECLARE now_millis BIGINT;
DECLARE our_epoch BIGINT DEFAULT 1314220021721;
DECLARE shard_id INT DEFAULT 1;
SET now_millis = (SELECT UNIX_TIMESTAMP(NOW(3)) * 1000);
SET seq_id = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = "dbname" AND TABLE_NAME = "tablename");
SET NEW.id = (SELECT ((now_millis - our_epoch) << 23) | (shard_id << 10) | (SELECT MOD(seq_id, 1024)));
END
Run Code Online (Sandbox Code Playgroud)
该表看起来大致如下:
CREATE TABLE tablename (
id BIGINT …Run Code Online (Sandbox Code Playgroud) 我正在尝试建立一个排序的博客系统,我遇到了一个小问题.
简单地说,我的article表中有3列:
id SERIAL,
category VARCHAR FK,
category_id INT
Run Code Online (Sandbox Code Playgroud)
id column显然是PK,它被用作所有文章的全局标识符.
category 列很好..类别.
category_id用作UNIQUE类别中的ID,因此目前存在UNIQUE(category, category_id)约束.
不过,我也想为category_id以自动递增.
我想要它,以便每次我执行像这样的查询
INSERT INTO article(category) VALUES ('stackoverflow');
Run Code Online (Sandbox Code Playgroud)
我希望category_id根据最新category_id的"stackoverflow"类别自动填充列.
在我的逻辑代码中实现这一点非常容易.我只选择最新的num并插入+1,但这涉及两个单独的查询.我正在寻找一个可以在一个查询中完成所有这些的SQL解决方案.
您好我正在开发一些firebase项目,我可以通过javascript将我的数据保存到firebase数据库中.但我无法弄明白我的数据库自动增加子值(我的孩子值是duyuru,你可以在下面看到详细信息).我在下面分享我的代码,你可以给我一些解决这个问题的提示.
<script>
// Initialize Firebase
var config = {
apiKey: "sample1",
authDomain: "sample2",
databaseURL: "sample3",
storageBucket: "sample4",
};
firebase.initializeApp(config);
var database = firebase.database();
firebase.initializeApp(config);
var database = firebase.database();
function writeUserData(userId, name, email, imageUrl) {
var kategori1 = document.getElementById("kategori").value;
var duyuru1 = document.getElementById("duyuru").value;
var name1 = document.getElementById("name").value;
var email1 = document.getElementById("email").value;
var imageUrl1 = document.getElementById("imageUrl").value;
firebase.database().ref(kategori1 +"/" + duyuru1).set({
username: name1,
email: email1,
profile_picture : imageUrl1
});
}
</script>
Run Code Online (Sandbox Code Playgroud)
而外面是这样的
{
"duyuru1": {
"email": "kjfdlkl",
"profile_picture": "dsfsd",
"username": "meraha"
}
} …Run Code Online (Sandbox Code Playgroud) javascript auto-increment firebase firebase-realtime-database
在 PostgreSQL 中,我们可以将列定义为SERIAL,以便通过插入查询自动递增它。
这种自动增量可以通过范围到另一个列值来实现吗?
我将用下面的例子解释我的问题。
在多租户 SaaS 应用程序中,可能存在这样的情况:我们可能需要item_id为每个用户帐户增加一列(例如项目表中的列)。
项目 ID | 帐户ID
100 | 100 1
101 | 101 1
102 | 102 1
100 | 100 2
对于表格格式错误表示抱歉。我希望您了解基本结构。
在上面的示例中,一旦新帐户(例如帐户 2)创建了新项目,item_id序列计数就应再次从头开始,即 100。
如果帐户1中的用户删除item_id102并创建新的项目记录,则应item_id设置为103,依此类推。
我试图找到解决方案,但无法使用谷歌搜索获得指针。因此,任何帮助将不胜感激!
PS:我知道这可以从后端代码处理,但我更想知道数据库是否有解决方案。
auto-increment ×10
postgresql ×4
identity ×2
mysql ×2
sql ×2
c# ×1
constructor ×1
firebase ×1
h2 ×1
instagram ×1
javascript ×1
sharding ×1
sql-server ×1
t-sql ×1
triggers ×1
userid ×1