查找给定表的所有相关表

时间:2010-03-29 18:28:47

标签: sql

我正在开发超过700个表。我需要查看给定表的所有相关表的列表。你能推荐一款能够提供这种功能的应用吗?

5 个答案:

答案 0 :(得分:27)

如果您的数据库支持信息架构视图(大多数都支持),那么您可以运行此查询:

SELECT
    c.CONSTRAINT_NAME,
    cu.TABLE_NAME AS ReferencingTable, cu.COLUMN_NAME AS ReferencingColumn,
    ku.TABLE_NAME AS ReferencedTable, ku.COLUMN_NAME AS ReferencedColumn
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS c
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cu
ON cu.CONSTRAINT_NAME = c.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku
ON ku.CONSTRAINT_NAME = c.UNIQUE_CONSTRAINT_NAME

这将输出所有参照约束(外键),源(引用)表/列和主键(引用)表/列的列表。

如果您想查看对特定表的引用,只需添加:

WHERE ku.TABLE_NAME = 'SomeTable'

答案 1 :(得分:15)

使用内置过程获取给定表的相关表的简单且最简单的解决方案。

public class CustomEditText extends LinearLayout {

private AppCompatButton mButton;
private AppCompatEditText mEditText;

public CustomEditText(Context context) {
    this(context, null, 0);
}

public CustomEditText(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public CustomEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    setOrientation(HORIZONTAL);

    /** Get Attributes **/

    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomEditText);

    int lines = typedArray.getInt(R.styleable.CustomEditText_android_lines, 1);
    int gravity = typedArray.getInt(R.styleable.CustomEditText_android_gravity, Gravity.CENTER_VERTICAL);
    int inputType = typedArray.getInt(R.styleable.CustomEditText_android_inputType, InputType.TYPE_CLASS_TEXT);
    int imeOptions = typedArray.getInt(R.styleable.CustomEditText_android_imeOptions, EditorInfo.IME_ACTION_DONE);
    String hint = typedArray.getString(R.styleable.CustomEditText_hint);

    typedArray.recycle();

    /** Construct Button **/

    mButton = new AppCompatButton(context);
    addView(mButton);

    /** Construct EditText **/

    mEditText = new AppCompatEditText(context);
    mEditText.setGravity(gravity);
    mEditText.setHint(hint);
    mEditText.setImeOptions(imeOptions | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
    mEditText.setInputType(inputType | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
    if (!((inputType & InputType.TYPE_TEXT_FLAG_MULTI_LINE) == InputType.TYPE_TEXT_FLAG_MULTI_LINE
            && lines == 1)) mEditText.setLines(lines);
    addView(mEditText);
}

public AppCompatEditText getEditText() {
    return mEditText;
}

public AppCompatButton getButton() {
    return mButton;
}
}

答案 2 :(得分:7)

根据数据库产品的不同,您应该能够查询INFORMATION_SCHEMA个视图,如下所示:

Select FK.TABLE_SCHEMA, FK.TABLE_NAME
From INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS As RC
    Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As PK
        On PK.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME
    Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As FK
        On FK.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
Where PK.TABLE_SCHEMA = 'dbo'
    And PK.TABLE_NAME = '<target table name>'   

答案 3 :(得分:1)

MS Visio Pro可以很好地为各种数据库(通过ODBC)逆向工程db模式,并提供非常灵活的图表。

提醒:无论您使用何种系统,您都不希望同时拉入所有700个表。尝试创建多个逻辑分组和分离的图表。希望在数据库中有很多这样的分组。

答案 4 :(得分:0)

我使用DataGrip图,其中已启用“键列”,而仅禁用了“列”。这当然不是清单,而且我无法想象在具有700个表的DB上的外观,但这是我查看项目中表之间所有关系的最方便的方法。