postgresql 查询有主键的表
时间: 2023-08-05 12:01:58 浏览: 53
你可以使用以下SQL语句查询拥有主键的表:
```sql
SELECT table_name
FROM information_schema.tables
WHERE table_schema='public'
AND table_type='BASE TABLE'
AND table_name IN (SELECT table_name
FROM information_schema.table_constraints
WHERE constraint_type='PRIMARY KEY');
```
这个查询将会返回所有在public架构下,拥有主键的表的名称。请注意,如果你的表不在public架构下,你需要将上面的查询中的table_schema参数修改成你的架构名称。
相关问题
postgresql 表查询 主键不走索引
如果您的PostgreSQL表的主键不使用索引进行查询,可能有以下几个原因:
1. 索引未创建或已损坏:请确保已在主键列上创建了索引,并且该索引正常工作。您可以使用以下命令检查索引是否存在:
```
\d table_name
```
如果索引未显示,请使用以下命令在主键列上创建索引:
```
CREATE INDEX index_name ON table_name (primary_key_column);
```
2. 数据不均匀:如果表中的数据分布不均匀,则可能会导致索引不起作用。例如,如果表中有大量重复的值,则索引可能会失效。在这种情况States.size(); i++) {
if (dfaStates[i].lr0Items.size() == lr0Items.size()) {
bool isSame = true;
for (int j = 0; j < lr0Items.size(); j++) {
LR0Item item1 = lr0Items[j];
LR0Item item2 = dfaStates[i].lr0Items[j];
if (item1.productionIndex != item2.productionIndex || item1.dot != item2.dot) {
isSame = false;
break;
}
}
if (isSame) {
return i;
}
}
}
return -1;
}
```
4. 进行语法分析
在SLR(1)分析中,需要使用栈来保存DFA状态编号和符号。可以使用一个结构体来表示栈:
```
struct StackItem {
int stateIndex; // DFA状态编号
char symbol; // 符号
};
```
可以使用一个vector来表示栈:
```
vector<StackItem> stack;
```
在分析过程中,需要读入一个输入字符串,并将其转换为一个字符数组。然后,从栈中取出当前状态,并读入下一个字符,根据ACTION和GOTO分析表中的项进行相应的操作。
- 如果ACTION[s][a]为"shift j",则将j推入栈中,并将输入字符指针后移一位。
- 如果ACTION[s][a]为"reduce A -> α",则从栈中弹出|α|个状态和符号,将A推入栈中,并将GOTO[top()][A]推入栈中。
- 如果ACTION[s][a]为"accept",则分析成功。
- 如果ACTION[s][a]为"error",则分析失败。
可以通过以下代码来实现语法分析的过程:
```
stack.push_back(StackItem{0, '#'});
int i = 0;
while (i < strlen(input)) {
int s = stack.back().stateIndex;
char a = input[i];
if (actionTable[s][(int)a].action == 's') { // Shift
int j = actionTable[s][(int)a].nextState;
stack.push_back(StackItem{j, a});
i++;
} else if (actionTable[s][(int)a].action == 'r') { // Reduce
int reduceProductionIndex = actionTable[s][(int)a].nextState;
Production production = productions[reduceProductionIndex];
int alphaLength = production.right.length();
vector<StackItem> poppedItems(alphaLength);
for (int j = 0; j < alphaLength; j++) {
poppedItems[j] = stack.back();
stack.pop_back();
}
reverse(poppedItems.begin(), poppedItems.end());
int t = stack.back().stateIndex;
postgresql 有什么主键
在 PostgreSQL 中,可以使用以下几种方式来定义主键:
1. 单列主键:使用单个列作为主键,通常是整数类型。例如:
```sql
CREATE TABLE mytable (
id INTEGER PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INTEGER
);
```
2. 多列主键:使用多个列作为联合主键。例如:
```sql
CREATE TABLE mytable (
id1 INTEGER NOT NULL,
id2 INTEGER NOT NULL,
name VARCHAR(50) NOT NULL,
PRIMARY KEY (id1, id2)
);
```
3. UUID 主键:使用 UUID(通用唯一标识符)作为主键。例如:
```sql
CREATE TABLE mytable (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name VARCHAR(50) NOT NULL,
age INTEGER
);
```
其中,`uuid_generate_v4()` 是一个 PostgreSQL 内置函数,用于生成一个随机的 UUID 值。
4. 自定义主键:使用应用程序自己生成的唯一标识符作为主键。例如:
```sql
CREATE TABLE mytable (
id VARCHAR(50) PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INTEGER
);
```
可以使用应用程序自己的算法来生成唯一的 ID 值,例如使用时间戳、哈希函数等。需要注意的是,自定义主键通常需要保证唯一性和不变性,否则可能会导致数据不一致的问题。