是'主键'和& Berkeley DB中存在/要求“外键”概念吗?

时间:2014-09-23 13:27:07

标签: sql berkeley-db

根据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        ");

在Berkeley DB中,人们会这样做:

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);

我的问题:

我们拨打student_id时是否设置了主键(db_create())?如果否,基于student_id字段的行如何唯一?

1 个答案:

答案 0 :(得分:0)

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

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