【问题标题】:Does 'primary key' & 'foreign key' concept exist/required in Berkeley DB?Berkeley DB 中是否存在/需要“主键”和“外键”概念?
【发布时间】:2014-09-23 13:27:06
【问题描述】:

据此link

在SQL中使用主键(student_id)创建一个表,如下所示:

CREATE TABLE students(student_id CHAR(4) NOT NULL,
    lastname CHAR(15), firstname CHAR(15), PRIMARY KEY(student_id));

在 Berkeley DB 中,我们可以这样做,使用以下代码:

struct student_record {
    char student_id[4];
    char last_name[15];
    char first_name[15];
};

DB *dbp, *sdbp;
int ret;

/* Open/create primary */
if ((ret = db_create(&dbp, dbenv, 0)) != 0)
    handle_error();
if ((ret = dbp->open(dbp,
    "students.db", NULL, DB_BTREE, DB_CREATE, 0600)) != 0)
    handle_error();

从应用程序的角度来看,将内容放入数据库的工作方式与没有二级索引的情况完全相同;可以简单地将记录插入主数据库。在 SQL 中,会执行以下操作:

INSERT INTO student
    VALUES ("WC42", "Churchill      ", "Winston        ");

在伯克利数据库中,有一个:

struct student_record s;
DBT data, key;

memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
memset(&s, 0, sizeof(struct student_record));
key.data = "WC42";
key.size = 4;
memcpy(&s.student_id, "WC42", sizeof(s.student_id));
memcpy(&s.last_name, "Churchill      ", sizeof(s.last_name));
memcpy(&s.first_name, "Winston        ", sizeof(s.first_name));
data.data = &s;
data.size = sizeof(s);
if ((ret = dbp->put(dbp, txn, &key, &data, 0)) != 0)
    handle_error(ret);

我的问题:

当我们调用db_create()时,我们是否设置了主键(student_id)?如果不是,如何根据student_id 字段使行唯一?

【问题讨论】:

  • @PraveenKumar:什么是“C/C++”?

标签: sql berkeley-db


【解决方案1】:

您必须阅读整个页面,而不仅仅是前几行。

键的设置方式将进一步探索。它与db_create() 无关,它甚至没有定义任何“表”结构;确实,正如您在休息室所说的那样,伯克利数据库是非关系型的,没有这样的概念。相反,键是“手动”设置的,每行。如果您愿意,您可以将密钥基于学生 ID,但这不会自动发生。

【讨论】:

  • 是的,你是对的! key.data = "WC42";dbp->put(dbp, txn, &key, &data, 0)
  • 但是,我们如何确保在 berkeley DB 中启用外键约束?
猜你喜欢
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
相关资源
最近更新 更多