【问题标题】:Non-EQ relation error Cassandra - how fix primary key?非 EQ 关系错误 Cassandra - 如何修复主键?
【发布时间】:2014-08-30 09:16:30
【问题描述】:

我创建了一个表帖子。当我提出请求时选择:

return $this->db->query('SELECT * FROM "posts" WHERE "id" IN(:id) LIMIT '.$this->limit_per_page, ['id' => $id]);

我得到错误:

PRIMARY KEY 列“id”不能被限制(前一列 “post_at”要么不受限制,要么不受非 EQ 关系的限制)

我的表转储是:

CREATE TABLE posts (
  id       uuid,
  post_at  timestamp,
  user_id  bigint,
  name     text,
  category set<text>,
  link     varchar,
  image    set<varchar>,
  video    set<varchar>,
  content  map<text, text>,
  private  boolean,
  PRIMARY KEY (user_id,post_at,id)
  )
  WITH CLUSTERING ORDER BY (post_at DESC);

我阅读了一些关于主键和集群键的文章,并理解,当有一些主键时 - 我需要使用运算符 =IN。就我而言,我不能使用一个主键。您建议我更改表结构,该错误会消失吗?

【问题讨论】:

  • 只需尝试在主键中交换 user_id 和 id,也可以使用 = 运算符添加一个具有您知道的值的列,例如值为 1 的clom1
  • 没有我知道值的clom1,所有内容都不一样,我可以创建额外的clom1并添加每行总是值1?
  • 是的,您必须创建一个可以使用的具有固定值的列
  • 我改变你的建议:现在有一个查询:return $this-&gt;db-&gt;query('SELECT * FROM "posts" WHERE "index_field" = :index AND "id" IN(:id) LIMIT '.$this-&gt;limit_per_page, ['id' =&gt; $id, 'index' =&gt; 1]);Get error: 'Syntax_error: line 1:45 no viable alternative at input 'index'
  • 拜托,你能给我更多的例子吗?谢谢

标签: cassandra cassandra-2.0 cassandra-cli


【解决方案1】:

我的虚拟表结构

CREATE TABLE posts (
  id       timeuuid,
  post_at  timestamp,
  user_id  bigint,
  PRIMARY KEY (id,post_at,user_id)
  )
  WITH CLUSTERING ORDER BY (post_at DESC);

在插入一些虚拟数据之后

我查询select * from posts where id in (timeuuid1,timeuuid2,timeuuid3);

我使用 cassandra 2.0 和 cql 3.0

【讨论】:

  • 谢谢,您能否检查一下您的查询是否有工作限制?我还使用归档的 user_id 作为运算符 WHERE。我已经说过了,请尝试使用 user_id 字段。非常感谢你。
  • 哦,对不起,我把自己弄糊涂了。我现在会检查你的版本
  • 当我使用查询时:SELECT * FROM "posts" WHERE "id" IN(20b40eb5-4174-4762-a7fe-1ab8299e5da3, 627a42e1-64a0-4be8-b307-a012b8a8d889); 在结果查询中我得到 0 行,但是在表 posts 中存在具有相同 id UUID
  • 如果您使用的是 cassandra 集群,则可能是一致性问题。还有为什么表名和列名用引号引起来?
  • 根据文档布尔数据类型用作字符串
猜你喜欢
  • 2016-03-29
  • 2015-02-10
  • 2015-03-25
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多